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 всегда пуста (и, конечно, ничего не печатается на консоли).
Ответы
Ответ 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)