2010-12-08 23 views
6

我有很多作爲計劃任務運行的腳本。因此,他們對任何故障執行$host.setshouldexit(1),這在任務調度程序中顯示爲返回碼。如何僅在非交互式運行時才從Powershell腳本返回退出代碼

我也希望能夠在調試和測試時交互式運行這些腳本。所以$host.setshouldexit()殺死我的powershell或ISE會話。

我的問題是:如何檢測腳本是否以非交互方式運行?如果是,那麼我將使用setshouldexit,否則它將打印錯誤代碼或無損的東西。 (請注意,我不想使用[environment]::userinteractive,因爲這些腳本並不總是在操作系統認爲是非交互式會話中運行。)

有一個非交互式開關用於計劃任務。有沒有什麼辦法可以從powershell中查詢?

回答

6

$Host.SetShouldExit方法不應該是必需的,實際上是不一致的,這取決於你如何調用你的腳本。使用關鍵字exit應該可以幫助您退出狀態。

使用powershell -F script.ps1

  • exit - 工程
  • SetShouldExit - 忽略

使用powershell -c '.\script.ps1

  • exit - 狀態降低爲0或1,成功或失敗的腳本,尊重沉着應對。
  • SetShouldExit - 以正確的狀態退出,但腳本中的剩餘行仍在運行。

使用powershell -c '.\script.ps1; exit $LASTEXITCODE [1]:

  • exit - 工程
  • SetShouldExit - 退出時的狀態== 0,並留在臺詞仍然運行。

直接從PowerShell的(> .\script.ps1)調用:

  • exit - 工程
  • SetShouldExit - 終止呼叫PowerShell主機與給定的退出狀態
2

爲什麼不僅僅需要一個參數「測試」來確定測試過程中的正確行爲?你有一個歷史緩衝區,所以它幾乎不需要再打字。

+0

嗯,這並不壞。我要買它。 – scobi 2010-12-08 23:13:47

2

我有同樣的問題。對我來說,以下工作:

# Exit with Return Code when NOT using PowerShell ISE 
if ($psise -eq $Null) 
{ 
    $host.SetShouldExit(1) 
} 
+2

有比ISE更多的交互式shell。 – scobi 2011-06-06 02:33:05

2

在找到你的問題我已經採取了問題有點進一步發現$MyInvocation.MyCommand.Name。這在命令解釋器和ISE命令解釋器中都是錯誤的。而當一個腳本(我的是jest.ps1)只包含行:Write-Host $MyInvocation.MyCommand.Name從CMD.EXE調用運行的powershell.exe:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -NoExit -NonInteractive -NoProfile -File "M:\WindowsPowerShell\Jest.ps1" 

輸出很簡單:

Jest.ps1

+0

而且,順便說一句,謝謝你使用$ host.SetShouldExit(1)的例子! – Stef 2012-11-15 19:24:08

+0

內聯代碼用反引號(`)標記,代碼塊通過用4個空格縮進每行來標記。請參閱[編輯常見問題](http://stackoverflow.com/editing-help#comment-formatting)。 – 2012-11-15 19:42:49

1

檢查$ Host.Name。如果您的腳本在IDE外部運行,它將返回「ConsoleHost」的值。否則,它將返回對IDE的引用,例如「Windows PowerShell ISE主機」或「PowerGUIScriptEditorHost」。

我必須使用SetShouldExit,因爲運行腳本的調度程序通常會忽略指示失敗的其他方法。當$ Host.Name是「ConsoleHost」時,我添加一個允許SetShouldExit的函數。它在測試過程中節省了很多IDE崩潰。

相關問題