Powershell在一个循环内启动一个进程

问题描述:

我想写一个负载均衡的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

移动ReadToEnd呼叫WaitForExit

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

你仍然有可能发生死锁。您可以坚持阅读'StandardOutput',但进程可能在'StandardError'中写入。 – PetSerAl