You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:58:02