PowerShell Copy-Item失败后如何捕获系统错误信息并写入日志?
解决PowerShell文件复制日志与错误捕获问题
嗨,作为PowerShell新手,你已经迈出了很棒的一步!咱们来看看你的脚本里几个关键的问题,以及如何修复它们:
主要问题分析
- 错误捕获失效:你用了
$_.Exception.Message,但这个变量只有在管道上下文或者try/catch的catch块里才能正确获取错误信息。你当前用-errorAction silentlyContinue配合$?的方式,没办法通过$_拿到异常详情。 - 目标路径逻辑问题:你的
$dest变量在第一次循环处理后会被修改(比如变成as001.LOG),第二个源文件处理时会从这个修改后的路径开始检查,这可能不符合你“每个源文件都从原始目标名开始判断重命名”的需求。 - 日志信息不够详细:当前日志只说“成功复制”,但没记录具体是哪个源文件;失败时也没标注对应的源路径,后期排查会很麻烦。
修正后的脚本
# 定义基础目标路径(注意不要带文件名,方便后续拼接) $baseDestPath = "\\server1\folder\" $sourcePaths = "\\server2\folder\as00.LOG", "\\server3\folder\as00.LOG" $logPath = "\\server1\folder\CopyLogs.txt" foreach ($sourcePath in $sourcePaths) { # 提取源文件的文件名,用于生成目标文件名 $fileName = [System.IO.Path]::GetFileName($sourcePath) $destFilePath = Join-Path -Path $baseDestPath -ChildPath $fileName $i = 1 # 检查目标文件是否存在,存在则生成带序号的新文件名 while (Test-Path -Path $destFilePath) { $newFileName = [System.IO.Path]::GetFileNameWithoutExtension($fileName) + "$i" + [System.IO.Path]::GetExtension($fileName) $destFilePath = Join-Path -Path $baseDestPath -ChildPath $newFileName $i += 1 } try { # 使用 -ErrorAction Stop 让错误抛出,进入catch块 Copy-Item -Path $sourcePath -Destination $destFilePath -Force -ErrorAction Stop # 写入成功日志,包含具体的源和目标路径 $successLog = "Date: $((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')). Status: Successfully copied. Source: $sourcePath -> Destination: $destFilePath" Add-Content -Path $logPath -Value $successLog } catch { # 在catch块中可以通过 $_ 捕获异常信息 $errorMessage = $_.Exception.Message # 写入失败日志,包含具体源路径和错误详情 $failureLog = "Date: $((Get-Date).ToString('yyyy-MM-dd HH:mm:ss')). Status: Copy Failure. Source: $sourcePath. Error: $errorMessage" Add-Content -Path $logPath -Value $failureLog } }
关键修改说明
- 改用try/catch捕获错误:
- 把
-ErrorAction silentlyContinue换成-ErrorAction Stop,这样Copy-Item遇到错误时会抛出终止错误,进入catch块。 - 在catch块中,
$_.Exception.Message就能正确获取到服务器不可用、权限不足等具体错误信息了。
- 把
- 重置目标路径逻辑:
- 每个源文件处理前,都从原始文件名开始检查是否存在,避免前一个文件的修改影响后续文件。
- 使用
[System.IO.Path]类的方法来安全处理文件名和路径,避免手动拼接字符串出错。
- 增强日志信息:
- 日志中添加了源文件路径、目标文件路径,方便后期排查问题。
- 日期格式用了
yyyy-MM-dd HH:mm:ss,可读性更强。
- 替换echo和out-file:
- 用
Add-Content代替echo | out-file -append,这是PowerShell中更推荐的追加内容到文件的方式,性能和兼容性更好。
- 用
这样修改后,你的脚本就能正确捕获各种系统错误,并且日志信息更清晰啦!
内容的提问来源于stack exchange,提问作者Lynn
相关产品推荐
相关产品推荐

