Вы можете объединить поток ошибок и другие данные в success stream и различать исходные потоки по типу данных каждого объекта трубопровода:
myfunction -channel1 -channel2 *>&1 | ForEach-Object {
$entryType = switch ($_.GetType().FullName) {
'System.Management.Automation.ErrorRecord' { 'error'; break }
'System.Management.Automation.WarningRecord' { 'warning'; break }
default { 'information'}
}
write-eventlog @eventlogparams -entrytype $entryType -message $_
}
Перенаправление *>&1
отправляет выходные данные из всех (*
) потоков в (&
) поток успеха (1
), так что все выходные данные, независимо от того, какой поток он пришел от, отправляется по конвейеру .
Вышесказанное касается только ошибок и предупреждений, а также сообщает обо всем остальном, включая вывод об успешном завершении, в качестве информации, но этот подход легко расширить - см. Нижнюю часть.
См. about_Redirections для обзора всех 6 потоков вывода, доступных в PowerShell (начиная с версии 6).
Чтобы проиллюстрировать технику на более простом примере:
& { Write-Output good; Write-Error bad; Write-Warning problematic } *>&1 | ForEach-Object {
$entryType = switch ($_.GetType().FullName) {
'System.Management.Automation.ErrorRecord' { 'error'; break }
'System.Management.Automation.WarningRecord' { 'warning'; break }
default { 'information'}
}
'[{0}] {1}' -f $entryType, $_
}
Вышеуказанные выходы:
[information] good
[error] bad
[warning] problematic
Список типов данных, выводимых различными потоками :
Stream Type
------ ----
#1 (Success) (whatever input type is provided).
#2 (Error) [System.Management.Automation.ErrorRecord]
#3 (Warning) [System.Management.Automation.WarningRecord]
#4 (Verbose) [System.Management.Automation.VerboseRecord]
#5 (Debug) [System.Management.Automation.DebugRecord]
#6 (Information) [System.Management.Automation.InformationRecord]
Для создания приведенного выше списка использовался следующий код (кроме первой строки данных):
& {
$VerbosePreference = $DebugPreference = $InformationPreference = 'Continue'
$ndx = 2
"Write-Error", "Write-Warning", "Write-Verbose", "Write-Debug", "Write-Information" | % {
& $_ ($_ -split '-')[-1] *>&1
++$ndx
} | Select-Object @{n='Stream'; e={"#$ndx ($_)"} }, @{n='Type'; e={"[$($_.GetType().FullName)]"} }
}