我编写了一个Powershell脚本,该脚本将用于自动构建过程。
当脚本采用正确的路径时,是否需要编写退出代码0(例如,不进入指示错误情况的if块)?
另外,exit(带代码)和$ host.SetShouldExit()有什么区别?
答案 0 :(得分:4)
在类似的场景中,我依赖于异常(throw)和其他类型的终止错误:在这种情况下,PowerShell的退出代码为1。如果脚本自行完成(即使没有终止错误),那么PowerShell的退出代码为0,我们不必调用exit 0
。如果我们需要0和1之类的东西,那么我们确实必须使用exit
或SetShouldExit
(但请参阅下面的评论)。
我们来看看脚本。
test1.ps1
'before2'
.\test2
'after2'
'before3'
.\test3
'after3'
'before4'
.\test4
'after4'
test2.ps1
'inner before 2'
exit 2
'inner after 2'
test3.ps1
'inner before 3'
$host.SetShouldExit(3)
'inner after 3'
test4.ps1
throw 'Oops'
test1.ps1的输出:
before2
inner before 2
after2
before3
inner before 3
inner after 3
after3
before4
Oops
At ...
+ throw <<<< 'Oops'
在这个测试场景中,test4.ps1类型的工作和test2.ps1和test3.ps1类型不起作用(如果工作意味着失败并立即退出会话)。
输出显示exit
终止当前脚本而SetShouldExit
没有终止。
由于powershell.exe .\test1
,$host.SetShouldExit(3)
的退出代码为3。我试图禁用该行来检查exit 2
是否使退出代码为2.不,它没有,由于test4中的失败,退出代码为1。
我注意到了另外一个区别。如果我从交互式PowerShell控制台调用脚本而不是脚本中的$host.SetShouldExit
,则会在调用后关闭控制台。 exit
没有。
$host.SetShouldExit
的行为可能取决于主机的实现。例如,在一个我自己的主机出口根本不受支持(不允许关闭托管应用程序),我SetShouldExit
的实现基本上什么都不做。