抛出异常时如何设置退出代码

时间:2015-02-25 16:31:07

标签: powershell powershell-v4.0

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

如何在抛出异常时设置正确的退出代码?

5 个答案:

答案 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 --> trueexit 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