ВАЖНЫЙ:
Мы использовали функцию, предоставленную LPG выше .
Однако в нем содержится ошибка, с которой вы можете столкнуться при запуске процесса, генерирующего большой объем вывода. Из-за этого вы можете зайти в тупик при использовании этой функции. Вместо этого используйте адаптированную версию ниже:
Function Execute-Command ($commandTitle, $commandPath, $commandArguments)
{
Try {
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = $commandPath
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = $commandArguments
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
[pscustomobject]@{
commandTitle = $commandTitle
stdout = $p.StandardOutput.ReadToEnd()
stderr = $p.StandardError.ReadToEnd()
ExitCode = $p.ExitCode
}
$p.WaitForExit()
}
Catch {
exit
}
}
Дополнительную информацию по этой проблеме можно найти на MSDN :
Состояние взаимоблокировки может возникнуть, если родительский процесс вызывает p.WaitForExit перед p.StandardError.ReadToEnd, а дочерний процесс записывает достаточно текста для заполнения перенаправленного потока. Родительский процесс будет бесконечно ждать завершения дочернего процесса. Дочерний процесс будет бесконечно ждать, пока родительский процесс не прочитает полный поток StandardError.
$process= ping localhost
# сохранит вывод в переменной процесса.