MyScript.ps1:
exit 1
MyThrow.ps1:
throw "test"
在PowerShell中执行:
& ".\MyScript.ps1"
Write-Host $LastExitCode # Outputs 1
Clear-Variable LastExitCode
& ".\MyThrow.ps1"
Write-Host $LastExitCode # Outputs nothing
如何在抛出异常时设置正确的退出代码?
答案 0 :(得分:12)
你没有。抛出异常时,您希望有人处理它。有人会终止执行并设置退出代码。例如:
try {
& ".\MyThrow.ps1"
} catch {
exit 1
}
如果没有什么可以捕获你的异常,你不应该把它扔在第一个位置,而是立即退出(使用正确的退出代码)。
答案 1 :(得分:4)
实际上,您也可以使用throw设置代码,只需将其放在throw之前即可。
脚本内容:Throw.ps1
exit 222
throw "test"
输出:
PS C:\> .\Throw.ps1
PS C:\> $LASTEXITCODE
222
如果您这样运行它:
powershell .\Throw.ps1
输出如下:
PS C:\> powershell .\Throw.ps1
PS C:\> $LASTEXITCODE
1
这是问题,PowerShell退出代码应为0或1, 其他任何事情,最终将给您1的结果。
如果要尝试$,还有另外一件有趣的事情要提?运行脚本后,
如果是或否,结果取决于您要放入的内容。
exit 0 --> true
,exit 1 --> false
这里是一个例子:
脚本内容:Throw_1.ps1
exit 1
throw "test"
输出:
PS C:\> .\Throw_1.ps1
PS C:\> $?
False
脚本内容:Throw_0.ps1
exit 0
throw "test"
输出:
PS C:\> .\Throw_0.ps1
PS C:\> $?
True
如您所见,这正是您需要或想要实现的。
答案 2 :(得分:1)
小心:
使用Powershell 4及更低版本:
引发异常时,退出代码保持在 0 (不幸的是)
使用Powershell 5及更高版本:
引发异常时,退出代码默认为 1
答案 3 :(得分:0)
可以使用System.Environment设置退出代码并引发错误:
# set final exit code
[System.Environment]::ExitCode = 1
# throw unhanded exception to terminate script
throw "test"
答案 4 :(得分:0)
在powershell中运行mythrow.ps1将设置$?为false,并将添加到$ error对象数组中。使用另一个powershell进程运行它会将$ lastexitcode设置为1。
PS C:\> powershell mythrow.ps1
PS C:\> $lastexitcode
1