Если вы можете изменить оригинальный сценарий немного, а затем запустить оболочку сценария, вы должны быть в состоянии сделать что-то вроде этого (если вы не можете, то этот ответ совершенно бессмысленным;))
[CmdletBinding()]
Param()
Write-Error "error"
Write-Warning "warning"
Write-Output "output"
Write-Verbose "verbose"
, а затем вызвать скрипт с оболочкой, как это (доработанная с комментарием @ beatcracker в link)
.\test1.ps1 -ErrorAction Continue -WarningVariable warn1 `
-WarningAction SilentlyContinue `
-InformationVariable inf `
-InformationAction SilentlyContinue
$warn1 | foreach { $host.ui.WriteErrorLine($_) }
добавляя [CmdletBinding()]
к началу оригинального сценария можно назвать с Powershell CommonParameters, в том числе WarningVariable
и WarningAction
В этом конкретном скрипте ErrorAction необходимо было убедиться, что он не остановился на сообщении об ошибке записи. Очевидно, от вас не потребуется добиваться того, что вы ищете.
Помещая SilentlyContinue on WarningAction, вы выведете предупреждающие сообщения из потока stdout, сохранив их в WarningVariable, после чего вы сможете делать все, что захотите, с ними в конце. В этом случае просто прокручивая их и передавая их в stderr
То же самое касается InformationAction
и InformationVariable
относительно потока verbose
.
Как вы вызываете/вызываете сценарий в первую очередь? Пока вы вызываете его из PowerShell, многословные и предупреждающие потоки будут отделены от stdout –
@ MathiasR.Jessen 'powershell.exe -FilePath c: \ script.ps1 2> NUL' – iTayb
@ MathiasR.Jessen Это Я использую поток 'stdout' за пределами области powershell. – iTayb