Как захватить вывод процесса асинхронно в powershell?

Я хочу захватить stdout и stderr из процесса, который я запускаю в скрипте Powershell, и отобразить его асинхронно на консоли. Я нашел некоторую документацию на это через MSDN идругие блоги.

После создания и запуска приведенного ниже примера я не могу получить какой-либо вывод для асинхронного отображения. Все выходные данные отображаются только после завершения процесса.

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

В этом примере я ожидал увидеть вывод «hi» в командной строке до конца выполнения программы, потому что должно было инициироваться событие OutputDataReceived.

Я пробовал это, используя другие исполняемые файлы - java.exe, git.exe и т. Д. Все они имеют одинаковый эффект, поэтому мне остается думать, что есть что-то простое, что я не понимаю или пропустил. Что еще нужно сделать, чтобы читать stdout асинхронно?

Ответы на вопрос(4)

Ваш ответ на вопрос