Я хочу записать stdout и stderr из процесса, который я запускаю в Powershell script, и выводить его асинхронно на консоль. Я нашел документацию по этому поводу через 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?