Powershell. Перенаправление стандартного вывода

Иногда возникает необходимость в рамках сессии 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 можно тут

Добавить комментарий

Ваш адрес email не будет опубликован.