2016-04-25 62 views
0

我想寫一個負載均衡的powershell發佈腳本,似乎已經遇到了障礙。給定參數,下面的foreach循環將啓動一個使用MSDeploy部署的進程。Powershell在一個循環內啓動一個進程

foreach ($server in $ServersToDeploy) { 
    # Spin up a new process 
    $pinfo = New-Object System.Diagnostics.ProcessStartInfo 
    $pinfo.FileName = $MSDeploy 
    $pinfo.RedirectStandardError = $true 
    $pinfo.RedirectStandardOutput = $true 
    $pinfo.UseShellExecute = $false 
    $pinfo.Arguments = $arguments 
    $p = New-Object System.Diagnostics.Process 
    $p.StartInfo = $pinfo 
    $p.Start() | Out-Null 
    $p.WaitForExit() 
    $stdout = $p.StandardOutput.ReadToEnd() 
    $stderr = $p.StandardError.ReadToEnd() 

    # Output 
    if ($stderr) { 
     throw $stderr + ("Exit Code: " + $p.ExitCode) 
    } 
    Write-Host $stdout 
} 

在第一次運行,它會運行腳本,並使用適當的參數執行MSDeploy,但PowerShell的將無限期地等待第一個進程退出,但發佈似乎是兩臺服務器已成功執行了,因爲當我重新運行這個命令,這個過程對兩個服務器執行都很快且正確,沒有任何變化。

這讓我覺得這可能是一個計時問題,因爲當發佈速度很快時,它似乎可以工作,但是如果速度很慢,它會停留在發佈的第一次迭代中。

+0

上述這裏,您有可能的死鎖:'$ p.WaitForExit(); $ stdout = $ p.StandardOutput.ReadToEnd(); $ stderr = $ p.StandardError.ReadToEnd()'。 – PetSerAl

回答

2

移動ReadToEnd呼叫WaitForExit

... 
$p.Start() | Out-Null 
$stdout = $p.StandardOutput.ReadToEnd() 
$stderr = $p.StandardError.ReadToEnd() 
$p.WaitForExit() 
... 
+0

你仍然有可能發生死鎖。您可以堅持閱讀'StandardOutput',但進程可能在'StandardError'中寫入。 – PetSerAl