Como capturar a saída do processo de forma assíncrona no PowerShell?

Quero capturar stdout e stderr de um processo iniciado em um script do Powershell e exibi-lo de forma assíncrona no console. Encontrei alguma documentação sobre como fazer isso através do MSDN eoutros blogs.

Depois de criar e executar o exemplo abaixo, não consigo obter nenhuma saída a ser exibida de forma assíncrona. Toda a saída é exibida apenas quando o processo termina.

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

Neste exemplo, eu esperava ver a saída de "oi" na linha de comando antes do final da execução do programa porque o evento OutputDataReceived deveria ter sido acionado.

Eu tentei isso usando outros executáveis - java.exe, git.exe, etc. Todos eles têm o mesmo efeito, por isso penso que há algo simples que não estou entendendo ou que perdi. O que mais precisa ser feito para ler stdout de forma assíncrona?

questionAnswers(4)

yourAnswerToTheQuestion