2010-12-16 54 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基本上什麼都不做。