在自动构建过程中使用脚本

时间:2010-12-16 10:10:58

标签: powershell

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

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

另外,exit(带代码)和$ host.SetShouldExit()有什么区别?

1 个答案:

答案 0 :(得分: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没有终止。

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

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

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