¿Cómo capturar la salida del proceso de forma asíncrona en powershell?

Quiero capturar stdout y stderr de un proceso que inicio en un script de Powershell y mostrarlo de forma asíncrona en la consola. He encontrado documentación sobre cómo hacer esto a través de MSDN yotros blogs.

Después de crear y ejecutar el siguiente ejemplo, parece que no puedo obtener ningún resultado que se muestre de forma asincrónica. Toda la salida solo se muestra cuando finaliza el proceso.

$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()

En este ejemplo, esperaba ver el resultado de "hola" en la línea de comandos antes del final de la ejecución del programa porque el evento OutputDataReceived debería haberse activado.

He intentado esto usando otros ejecutables: java.exe, git.exe, etc. Todos tienen el mismo efecto, por lo que me queda pensar que hay algo simple que no entiendo o me he perdido. ¿Qué más hay que hacer para leer stdout de forma asincrónica?

Respuestas a la pregunta(4)

Su respuesta a la pregunta