为何PowerShell中Try/Catch块里Add-Content/Out-File生成空日志文件?
问题根源与解决方案
这是PowerShell错误处理机制里一个很常见的坑——Try/Catch 只捕获「终止错误」,但 Copy-Item 默认抛出的是「非终止错误」,所以你的Catch块根本没执行,日志自然是空的,错误直接输出到控制台了。
为什么会这样?
PowerShell把错误分成两类:
- 终止错误:会中断当前脚本/命令执行,能被
Try/Catch捕获。 - 非终止错误:默认不会中断执行,只会输出到控制台,不会触发
Try/Catch。
Copy-Item在找不到源文件时,默认抛出的就是非终止错误——这是PowerShell很多cmdlet的设计逻辑,因为有时候批量操作时,个别文件失败不应该中断整个任务。
解决方法(推荐第一种)
方法1:给Copy-Item加-ErrorAction Stop参数
强制把非终止错误转为终止错误,这样Try/Catch就能捕获到了:
Try{ Copy-Item -Path "D:\file.txt" -Destination "E:\file.txt" -ErrorAction Stop } Catch { $_.Exception.Message | Add-Content C:\logs\copy.log }
方法2:临时修改全局错误偏好
如果需要让整个脚本里的cmdlet都抛出终止错误,可以临时设置$ErrorActionPreference:
# 临时设置全局错误行为为Stop $ErrorActionPreference = "Stop" Try{ Copy-Item -Path "D:\file.txt" -Destination "E:\file.txt" } Catch { $_.Exception.Message | Add-Content C:\logs\copy.log } # 用完记得改回默认的Continue,避免影响其他命令 $ErrorActionPreference = "Continue"
额外说明
你之前试的Out-File -append没生效,本质也是因为Catch块没执行——错误根本没进到Catch里,当然写不了日志。加了-ErrorAction Stop之后,错误就会被捕获,写入日志的逻辑就能正常工作了。
内容的提问来源于stack exchange,提问作者4ndy
相关产品推荐
相关产品推荐

