从批处理脚本调用PowerShell中的异常处理

时间:2018-01-29 10:06:44

标签: powershell exception-handling

不幸的是,我的主机应用程序无法直接执行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抛出终止错误?

1 个答案:

答案 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,覆盖等。