Wie erfasse ich die Prozessausgabe asynchron in Powershell?

Ich möchte stdout und stderr von einem Prozess erfassen, den ich in einem Powershell-Skript starte, und es asynchron zur Konsole anzeigen. Ich habe eine Dokumentation dazu über MSDN und. Gefundenandere Blogs.

Nach dem Erstellen und Ausführen des folgenden Beispiels scheint keine Ausgabe asynchron angezeigt zu werden. Die gesamte Ausgabe wird nur angezeigt, wenn der Prozess beendet ist.

$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 hatte ich erwartet, dass die Ausgabe von "hi" in der Befehlszeile vor dem Ende der Programmausführung angezeigt wird, da das OutputDataReceived-Ereignis hätte ausgelöst werden müssen.

Ich habe dies mit anderen ausführbaren Dateien versucht - java.exe, git.exe usw. Alle haben den gleichen Effekt, daher muss ich denken, dass es etwas Einfaches gibt, das ich nicht verstehe oder übersehen habe. Was muss noch getan werden, um stdout asynchron zu lesen?