2010-12-16 23 views
3

我编写了一个Powershell脚本,该脚本将用于自动构建过程。在自动构建过程中使用脚本

当脚本采用正确的路径时(例如,不进入表示错误状态的if块),是否需要编写退出代码0?

此外,exit(带代码)和$ host.SetShouldExit()之间的区别是什么?

回答

4

在类似的情况下,我依赖异常(throw)和其他类型的终止错误:在这种情况下,PowerShell的退出代码是1。如果脚本自行完成(即使没有终止错误),PowerShell的退出代码为0,我们不必调用exit 0。如果我们需要0和1之类的东西,那么我们必须使用exitSetShouldExit(但请参阅下面的注释)。

让我们来看看脚本。

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没有。

由于$host.SetShouldExit(3)powershell.exe .\test1的退出代码为3。我试图禁用该行来检查exit 2是否使退出代码为2.否,它不会,由于test4中的失败,退出代码为1。

我注意到了一个区别。如果我从交互式PowerShell控制台调用脚本,而不是在脚本中使$host.SetShouldExit使调音台关闭控制台。 exit没有。

一个想法。 $host.SetShouldExit的行为可能取决于主机的实现。例如,在我自己的主机退出中根本不支持(不允许像这样关闭主机应用程序),我的实现SetShouldExit基本上什么都不做。