不幸的是,我的主机应用程序无法直接执行PowerShell脚本,所以我编写了一个批处理脚本,用脚本调用PowerShell脚本
@echo off
echo calling upgrade product with argument %2
if [%1] == [] (
powershell -ExecutionPolicy UnRestricted -command "%~dp0Product1.ps1 "ProductConfig.xml" -verbose; exit $LASTEXITCODE"
) else (
cd %1
powershell -ExecutionPolicy UnRestricted -command "%1\UpgradeProduct.ps1 %2 -verbose; exit $LASTEXITCODE"
)
在我的powershell脚本中,我有像
这样的代码$ErrorActionPreference="Stop"
try{
Copy-Item -Path $source -Destination $dest
}catch{
Write-Warning "Some Error"
}
当我从PowerShell窗口执行脚本时执行此操作正常(如果未找到$source
,则会抛出终止错误并打印Some Error
)。但是,当从批处理脚本执行时,如果找不到$source
Copy-Item
则会引发非终止错误并继续(不要打印Some Error
)。
如果找不到Copy-Item
,如何让$Source
抛出终止错误?
答案 0 :(得分:1)
你的拦截块中没有任何东西停止。 我假设您的写入警告被触发,但是在块运行后的代码。
你必须在catch块中返回一些内容,例如:
$ErrorActionPreference="Stop"
try{
Copy-Item -Path $source -Destination $dest
}catch{
Write-Warning "Some Error"
#$LASTEXITCODE is a special variable in powershell
$LASTEXITCODE = 1
exit $LASTEXITCODE
}
注意$ LASTEXITCODE变量,它是一个特殊变量,相当于%errorlevel%
,由" cmd调用"等命令使用。通过PowerShell。
您可以在PowerShell中使用此命令进行测试:
cmd.exe /c exit 5
$LASTEXITCODE
我建议你先检查路径是否存在:
try{
if(Test-Path $source){
Copy-Item -Path $source -Destination $dest -ErrorAction Stop
}else{
Write-Warning "$source not found."
$LASTEXITCODE = 1
exit $LASTEXITCODE
}
}catch{
Write-Error "Exception during copy: $($_)"
$LASTEXITCODE = 1
exit $LASTEXITCODE
}
兴趣点: ErrorAction用于功能级别。在脚本级别设置它将包括许多命令的此设置。 只有当复制失败时才会抛出异常:错误的ACL,覆盖等。