Ich möchte stdout und stderr von einem Prozess erfassen, den ich in einem Powershell-Skript starte und asynchron zur Konsole anzeigen. Ich habe eine Dokumentation über MSDN und other blogs gefunden.Wie wird die Prozessausgabe asynchron in der Powershell erfasst?
Nachdem ich das folgende Beispiel erstellt und ausgeführt habe, kann ich scheinbar keine Ausgaben asynchron anzeigen lassen. Die gesamte Ausgabe wird nur angezeigt, wenn der Prozess beendet wird.
$ps = new-object System.Diagnostics.Process
$ps.StartInfo.Filename = "cmd.exe"
$ps.StartInfo.UseShellExecute = $false
$ps.StartInfo.RedirectStandardOutput = $true
$ps.StartInfo.Arguments = "/c echo `"hi`" `& timeout 5"
$action = { Write-Host $EventArgs.Data }
Register-ObjectEvent -InputObject $ps -EventName OutputDataReceived -Action $action | Out-Null
$ps.start() | Out-Null
$ps.BeginOutputReadLine()
$ps.WaitForExit()
In diesem Beispiel erwarte ich die Ausgabe von „hallo“ auf der Kommandozeile vor dem Ende der Programmausführung zu sehen, weil das OutputDataReceived Ereignis ausgelöst werden soll.
Ich habe dies mit anderen ausführbaren Dateien versucht - java.exe, git.exe, etc. Alle von ihnen haben den gleichen Effekt, so dass ich denke, dass es etwas einfaches ist, dass ich nicht verstehe oder verpasst haben. Was muss noch getan werden, um stdout asynchron zu lesen?
schließen können, ich bekomme keine stdout oder stderr nach diesem Code ausgeführt wird. – Ci3
@ChrisHarris Wieder getestet (in PS 2.0) und es funktioniert für mich. Hast du irgendeine Ausnahme? Erhalten Sie eine Ausgabe, wenn Sie denselben Befehl direkt ausführen? –
Ich bekomme das Objekt mit Null-Werten für StdOut, StdErr zurückgegeben. Der Beendigungscode ist "0". Ich erwartete die Ausgabe von ping.exe mit einer Antwort, die Bytes, die Zeit, etc. Ist das richtig? Ich habe es genau so ausgeführt, wie du es hier hast. Ich betreibe Powershell 4. Ah, lief es einfach auf Powershell 2, und es funktioniert wie erwartet! – Ci3