PowerShell终止错误未停止脚本?关于$ErrorActionPreference的疑问
PowerShell终止错误与$ErrorActionPreference的误区解析
核心认知误区:终止错误并非都会停止整个脚本
PowerShell里的「终止错误」实际分为两类,这是你产生疑问的关键:
- 命令终止错误(Cmdlet-terminating errors):仅终止当前执行的单个命令,不会中断整个脚本的后续运行。比如用
-ErrorAction Stop强制触发的错误,或是部分cmdlet自身设计为遇到错误就终止当前命令,但默认不影响脚本后续代码。 - 脚本终止错误(Script-terminating errors):这类错误才会直接停止整个脚本执行,比如用
throw主动抛出的错误、未被try/catch捕获的严重错误,或是通过$ErrorActionPreference = 'Stop'将非终止错误升级后的错误。
$ErrorActionPreference的实际作用范围
你之前认为它只影响非终止错误的认知有误,它的作用覆盖两类错误:
- 控制非终止错误的显示与处理逻辑
- 影响命令终止错误的脚本执行走向:
- 设为
'Silently Continue'时,命令终止错误会被静默处理,脚本继续执行后续代码(这就是你遇到的情况:触发终止错误后Write-Host '2'仍正常运行) - 设为
'Stop'时,所有错误(包括非终止、命令终止)都会被升级为脚本终止错误,直接终止整个脚本
- 设为
实际代码验证
例1:命令终止错误不中断脚本
# 默认$ErrorActionPreference为'Continue' Get-Item -Path "不存在的路径" -ErrorAction Stop # 触发命令终止错误 Write-Host '2' # 此行会正常执行
例2:脚本终止错误中断脚本
throw "触发脚本终止错误" Write-Host '2' # 此行不会执行
例3:$ErrorActionPreference='Stop'升级错误
$ErrorActionPreference = 'Stop' Get-Item -Path "不存在的路径" # 原本是非终止错误,现在升级为脚本终止错误 Write-Host '2' # 此行不会执行
内容的提问来源于stack exchange,提问作者jssteele89
相关产品推荐
相关产品推荐

