Powershell 在循环中启动进程
Powershell starting a process within a loop
我正在尝试编写一个负载平衡的 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 会无限期地等待第一个进程退出,但发布似乎已经执行对两台服务器都成功,因为当我重新 运行 命令时,该过程对两台服务器都快速正确地执行,没有任何变化。
这让我觉得这可能是一个时间问题,因为当发布速度快时,它似乎可以工作,但速度慢时,它会在发布的第一次迭代时挂起。
将 ReadToEnd
调用移至 WaitForExit
之上
...
$p.Start() | Out-Null
$stdout = $p.StandardOutput.ReadToEnd()
$stderr = $p.StandardError.ReadToEnd()
$p.WaitForExit()
...
我正在尝试编写一个负载平衡的 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 会无限期地等待第一个进程退出,但发布似乎已经执行对两台服务器都成功,因为当我重新 运行 命令时,该过程对两台服务器都快速正确地执行,没有任何变化。
这让我觉得这可能是一个时间问题,因为当发布速度快时,它似乎可以工作,但速度慢时,它会在发布的第一次迭代时挂起。
将 ReadToEnd
调用移至 WaitForExit
...
$p.Start() | Out-Null
$stdout = $p.StandardOutput.ReadToEnd()
$stderr = $p.StandardError.ReadToEnd()
$p.WaitForExit()
...