2016-02-02 3 views
0

У меня есть сценарий, который возвращает данные через поток stdout (просто выполнив Write-Output в конце скрипта).Как написать подробные сообщения и предупреждения для STDERR?

К сожалению, у меня есть много Write-Verbose и Write-Warning по коду, и я хочу, чтобы записать данные в stderr потоке, чтобы не запутаться с моим выходом.

Я обнаружил, что Write-Warning, например, на самом деле звонил $host.UI.WriteWarningLine под капотом, но он пишет прямо на stdout без возможности его изменить.

Любые идеи?

+0

Как вы вызываете/вызываете сценарий в первую очередь? Пока вы вызываете его из PowerShell, многословные и предупреждающие потоки будут отделены от stdout –

+0

@ MathiasR.Jessen 'powershell.exe -FilePath c: \ script.ps1 2> NUL' – iTayb

+0

@ MathiasR.Jessen Это Я использую поток 'stdout' за пределами области powershell. – iTayb

ответ

2

Если вы можете изменить оригинальный сценарий немного, а затем запустить оболочку сценария, вы должны быть в состоянии сделать что-то вроде этого (если вы не можете, то этот ответ совершенно бессмысленным;))

[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.

0

Внешний вид PowerShell у вас есть только STDOUT и STDERR. Поток ошибок переходит в STDERR, все остальные потоки идут в STDOUT. В этот момент вы больше не сможете отделять подробный или предупреждающий вывод от обычного выхода.

 Смежные вопросы

  • Нет связанных вопросов^_^