Подтвердить что ты не робот

Powershell: Захват стандартных ошибок и ошибок с помощью объекта Process

Я хочу запустить java-программу из powershell и получить результаты, напечатанные на консоли.

Я следил за инструкциями по этому вопросу: Захват стандартных ошибок и ошибок при запуске

Но для меня это не сработало, как я ожидаю. Что я делаю неправильно?

Это script:

$psi = New-object System.Diagnostics.ProcessStartInfo
$psi.CreateNoWindow = $true
$psi.UseShellExecute = $false
$psi.RedirectStandardOutput = $true
$psi.RedirectStandardError = $true
$psi.FileName = 'java.exe'
$psi.Arguments = @("-jar","tools\compiler.jar","--compilation_level",   "ADVANCED_OPTIMIZATIONS", "--js", $BuildFile, "--js_output_file", $BuildMinFile)
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $psi
$process.Start() | Out-Null
$process.WaitForExit()
$output = $process.StandardOutput.ReadToEnd()
$output

Переменная $output всегда пуста (и, конечно, ничего не печатается на консоли).

4b9b3361

Ответ 1

Документы в свойстве RedirectStandardError указывают на то, что лучше поместить вызов WaitForExit() после вызова ReadToEnd(). Для меня работает правильно:

$psi = New-object System.Diagnostics.ProcessStartInfo 
$psi.CreateNoWindow = $true 
$psi.UseShellExecute = $false 
$psi.RedirectStandardOutput = $true 
$psi.RedirectStandardError = $true 
$psi.FileName = 'ipconfig.exe' 
$psi.Arguments = @("/a") 
$process = New-Object System.Diagnostics.Process 
$process.StartInfo = $psi 
[void]$process.Start()
$output = $process.StandardOutput.ReadToEnd() 
$process.WaitForExit() 
$output

Ответ 2

Небольшая вариация, позволяющая выборочно печатать выходные данные, если это необходимо. Как и в случае, если вы ищете только сообщения об ошибках или предупреждения, и, кстати, Кейт вы сохранили мой бекон с ответом...

$psi = New-object System.Diagnostics.ProcessStartInfo 
$psi.CreateNoWindow = $true 
$psi.UseShellExecute = $false 
$psi.RedirectStandardOutput = $true 
$psi.RedirectStandardError = $true 
$psi.FileName = 'robocopy' 
$psi.Arguments = @("$HomeDirectory $NewHomeDirectory /MIR /XF desktop.ini /XD VDI /R:0 /W:0 /s /v /np") 
$process = New-Object System.Diagnostics.Process 
$process.StartInfo = $psi 
[void]$process.Start()
do
{
   $process.StandardOutput.ReadLine()
}
while (!$process.HasExited)