2013-10-02 52 views
2

我在一臺機器上執行了一系列「任務」,這些機器在powershell scriptblocks中定義,如下所示(它們事實上是作爲更復雜的散列數組傳入的scriptblocks)。

$Tasks = @(
    { hostname.exe }, 
    { Get-PowerShellFunction }, 
    { (GWMI Win32_OperatingSystem).Version -imatch '6.1' }, 
    { Get-PowerShellFunction }, 
    { cmd /c "smth && exit 45" }  
) 

這些任務被調用時$Tasks[$i].Invoke()但已經意識到,因爲似乎沒有可靠的方法來檢查和.Invoke()

後使用 $?和/或 $LASTEXITCODE我不能在任務的狀態報告

我希望能夠做到這些事情。

  • 收集從所調用的腳本塊代碼的輸出(stdout和stderr)。
  • 如果調用的腳本塊中的代碼是布爾型的PowerShell代碼($True$False),則獲取調用的腳本塊的狀態(例如$?)。
  • 獲取被調用scriptnlock的狀態(例如$LASTEXITCODE),如果其中的代碼是一個Int32的外部命令(成功爲0,失敗爲!0)。
  • 允許此功能適用於PowerShell> = 2.0。

這可能嗎?

回答

4

從單一腳本塊的角度來看它:

$sb = { hostname.exe } 
$result = @{} 
$result.out = & $sb 
$result.status = $? 
$result.exitcode = $LASTEXITCODE 

如果您然後轉儲$results以檢驗性能:

PS C:\> $results 

Name       Value 
----       ----- 
exitcode      0 
out       POSHVM7 
status       True 

循環在scriptblocks在$tasks你可以只是您可能會追加的一系列結果:

$results = @() 
$Tasks | % { 
    $result = @{} 
    $result.out = & $_ 
    $result.status = $? 
    $result.exitcode = $LASTEXITCODE 
    $results += $result 
} 
+0

我認爲,雖然你已經展示了我的作品 - 實際上,我有一些非常類似於這個答案http://stackoverflow.com/a/8635765/742600,我傳遞一個scriptblock來調用 - 但這就是我我無法收集$ LASTEXITCODE。我想我會問一個新問題。 – shalomb

相關問題