Powershell在循环中启动进程

时间:2016-04-25 21:42:12

标签: powershell powershell-v4.0

我正在尝试编写一个负载均衡的PowerShell发布脚本,似乎遇到了障碍。下面的foreach循环将启动一个进程,在给定参数的情况下使用MSDeploy进行部署。

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会无限期地等待第一个进程退出,但是发布似乎已经成功执行了两个服务器,因为当我重新运行时该命令可以快速,正确地为两台服务器执行,无需更改。

这让我觉得这可能是一个时间问题,因为当发布快速通过时,它似乎有效,但是当它很慢时,它会挂起发布的第一次迭代。

1 个答案:

答案 0 :(得分:2)

ReadToEnd来电移到WaitForExit

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