Как объединить PowerShell runspace stderr, stdout et c в один поток - PullRequest
2 голосов
/ 08 января 2020

Я ищу эквивалент перенаправления конвейера PowerShell *> & 1 при запуске задания.

Я запускаю задания примерно так:

    $Instance = [PowerShell]::Create()
    $Instance.AddScript($CommandList)
    $Result = $Instance.BeginInvoke()
    $Instance.EndInvoke($Result)

Проблема выводится разделен на несколько потоков, и чтобы сообщить об этом, я должен сделать это:

    $Instance.Streams.Debug
    $Instance.Streams.Error
    $Instance.Streams.Information

Это группирует сообщения по типу, а не чередует их, так что нет никакого хорошего способа определить, где в ходе выполнения данная ошибка был брошен. Если бы они были объединены, ошибки появились бы сразу после соответствующих операторов Write-Host.

Похоже, что было бы 5 потоков (отладка, ошибка, информация, прогресс, подробность и предупреждение), и я хотел бы объединить их все, хотя простое объединение ошибок и информации было бы огромным шагом вперед.

Я огляделся вокруг объекта $ Instance и попытался найти что-то в InitialSessionState для передачи в Create (), но ничего очевидного не представилось.

1 Ответ

4 голосов
/ 08 января 2020

Чтобы получить доступ ко всем потокам в порядке вывода при использовании PowerShell SDK , вам также придется прибегнуть к *>&1:

$Instance = [PowerShell]::Create()

# Example commands that write to streams 1-3.
$CommandList = 'Write-Output 1; Write-Error 2; Write-Warning 3'

# Wrap the commands in a script block (`{...}`) and call it using 
# `&`, the call operator, which allows you to apply redirection `*>&1`
$null = $Instance.AddScript('& {' + $CommandList + '} *>&1')

$Result = $Instance.BeginInvoke()
$Instance.EndInvoke($Result) # Returns output merged across all streams.

Поскольку выходные объекты из потоки, отличные от потока успеха (1), имеют унифицированный тип, который отражает поток источника, вы можете проверить тип каждого выходного объекта, чтобы определить, из какого потока он пришел - подробности см. в этом ответе .

Для получения дополнительной информации о 6 выходных потоках PowerShell выполните Get-Help about_Redirection.

...