从批处理调用PowerShell时,如何让Copy-Item抛出终止错误?
我明白你遇到的困扰:直接在PowerShell窗口里执行脚本时,$source不存在会触发终止错误并进入catch块,但通过批处理调用时却只抛出非终止错误,脚本继续执行。这其实是因为批处理调用PowerShell的执行上下文里,全局错误偏好设置的生效逻辑和直接在PS窗口里有差异,或者Copy-Item本身的错误行为没被强制约束。
下面给你几个靠谱的解决办法:
1. 给Copy-Item强制添加-ErrorAction Stop参数
这是最直接有效的方式,不管全局错误偏好如何,强制让Copy-Item在出错时抛出终止错误。修改你PowerShell脚本里的Copy-Item行:
Copy-Item -Path $source -Destination $dest -ErrorAction Stop
这个参数会覆盖全局的$ErrorActionPreference设置,确保只要$source不存在,就会触发终止错误,直接进入catch块执行警告逻辑。
2. 确保$ErrorActionPreference在执行上下文里生效
有时候从批处理调用PowerShell命令时,脚本开头的$ErrorActionPreference="Stop"可能因为执行环境的问题没正确生效。你可以在批处理的PowerShell调用命令里提前设置这个偏好,再执行脚本:
修改批处理中的调用代码,比如第一个分支:
powershell -ExecutionPolicy UnRestricted -command "$ErrorActionPreference='Stop'; & '%~dp0Product1.ps1' \"ProductConfig.xml\" -verbose; exit $LASTEXITCODE"
这样先在PowerShell的执行会话里设置好错误偏好,再调用你的脚本,整个执行过程都会遵循“出错即终止”的规则。
3. 验证变量值的正确性
还有一种可能:批处理调用时传递的参数或者脚本里的$source变量值,和你直接在PS窗口测试时不一样。比如路径可能因为相对路径、引号转义的问题变成了有效值,导致没触发错误。你可以在脚本的try块开头加一行输出,确认$source的实际值:
Write-Host "当前要复制的源路径:$source"
这样能快速排查是不是变量本身的问题导致错误没触发。
内容的提问来源于stack exchange,提问作者Pramod

