2016-04-25 7 views
0

Ich versuche, ein load-balanced Powershell-Veröffentlichungsskript zu schreiben und scheint einen Roadblock zu treffen. Die folgende foreach-Schleife wird einen Prozess zur Bereitstellung mithilfe von MSDeploy mit den Argumenten ausführen.Powershell startet einen Prozess innerhalb einer Schleife

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 
} 

Auf dem ersten Lauf, wird es das Skript, und führen MSDeploy mit den richtigen Argumenten laufen, aber Powershell würde auf unbestimmte Zeit warten, bis der erste Prozess, um zu beenden, scheint aber die Publish erfolgreich für beide Server ausgeführt zu haben, denn wenn Ich führe den Befehl erneut aus, der Prozess wird schnell und ordnungsgemäß für beide Server ohne Änderungen ausgeführt.

Das lässt mich denken, dass dies ein Timing-Problem sein könnte, denn wenn das Publish schnell durchläuft, scheint es zu funktionieren, aber wenn es langsam ist, hängt es an der ersten Iteration des Publish.

+0

Sie haben mögliche Deadlock hier: '$ p.WaitForExit(); $ stdout = $ p.StandardOutput.ReadToEnd(); $ stderr = $ p.StandardError.ReadToEnd() '. – PetSerAl

Antwort

2

Verschieben Sie die ReadToEnd Anrufe über dem WaitForExit

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

Sie haben immer noch die Möglichkeit für Deadlock. Sie können beim Lesen von 'StandardOutput' feststecken, aber der Prozess kann beim Schreiben in' StandardError' hängen bleiben. – PetSerAl