Иногда возникает необходимость в рамках сессии PoSh запустить CMD утилиты. Структура вызова этих команд, из-за вложенности или например из-за удаленного выполнения, может усложниться, а результат их работы станет менее предсказуемым.
В этом случае нам может помочь перенаправление стандартного вывода
Выполнение команды с помощью «символа вызова»
Вызов утилиты CMD через & «ping» ya.ru выводится в самом окне PoSh, а не во внешнем окне CMD
Перенаправление из командлета Start-Process
Можно перенаправить вывод с помощью специального параметра RedirectStandardOutput
Start-Process ping "8.8.8.8" -WindowStyle Hidden -RedirectStandardOutput "C:\SO.txt"
Функция позволяющая задать набор значений для запуска процесса
В том числе задать перенаправление стандартного вывода и вывода ошибок
При этом используется .NET класс System.Diagnostics.ProcessStartInfo
# Задаем параметры запуска процесса
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.FileName = "nslookup"
$pinfo.Arguments = "google.com", "8.8.8"
$pinfo.UseShellExecute = $false
$pinfo.CreateNoWindow = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.RedirectStandardError = $true
# Создаем объект процесса, используя заданные параметры
$process = New-Object System.Diagnostics.Process
$process.StartInfo = $pinfo
# Запускаем процесс и ждем его завершения
$process.Start() | Out-Null
$process.WaitForExit()
# Получаем в отдельные переменные стандартный вывод и ошибки
$exitCode = $process.ExitCode
$stderr = $process.StandardError.ReadToEnd()
$stdout = $process.StandardOutput.ReadToEnd()
# Собираем результаты в один объект, для удобства
$result = [pscustomobject]@{
ExitCode = $exitCode
stderr = $stderr.Trim()
stdout = $stdout.Trim()
}
$result | ft -Wrap
Из-за того что IP адрес в Arguments указан заведомо неверно, мы получим об этом ошибку в переменную $stderr
Плюс использования этого скрипта заключается в том, что вывод будет записан в отдельные переменные, а так же в нем определяется «код выхода», по которому можно назначить обработку событий.
С кодами ошибок можете ознакомиться например здесь.
А прочитать про варианты выполнения команд оболочки CMD из сеанса PoSh можно тут
