PowerShell v5: подавление вывода по умолчанию во вложенных функциях

594
megamorf

Я хотел бы подавить любой вывод, тогда вызывается function_b:

Function function_a { "test" | Out-Default }  function function_b { [CmdletBInding()] param()  function_a }  # These are the things I've tried so far to no avail: [void](function_b) $null = function_b function_b | out-null function_b *>&1 | Out-null 

В Windows 10 внесено изменение в ведение журнала Центра обновления Windows. Теперь все регистрируется на каналах ETL вместо «$ env: SystemDrive \ Windows \ WindowsUpdate.log». Чтобы получить журналы в удобочитаемом формате, вы должны сгенерировать WindowsUpdateLog с помощью команды Get-WindowsUpdateLog, которая выдает на консоль много бесполезных вещей, которые я хотел бы подавить. Как оказалось, команда является частью модуля, а все вспомогательные функции в Get-WindowsUpdateLog используют Out-Default. Мой пример иллюстрирует способ построения этого модуля.

3
`& ` PetSerAl 8 лет назад 1

2 ответа на вопрос

2
megamorf

Спасибо @PetSerAl, это должно сработать, даже если оно не так чисто, как я надеялся :-)

& 
0
Bill Moore

Я узнал, что это возможно, кроме того, что он все еще немного сломан. Пример:

 PS> function out-default {$input | out-null}  #ok. Works great PS> mkdir xyz # output directory object is sent to null and not displayed to out-host 

Проблема в том, что он работает СЛИШКОМ хорошо, потому что, скажем, вы хотите сохранить объект в возвращаемом varable.

 PS> $dir = mkdir xyz2  PS> $dir #nothing to returned! 

С другой стороны, переопределение out-default легко удалить:

 PS> del function:out-default 

Теперь ожидаемое поведение по умолчанию отменено:

 PS> $dir = mkdir xyz3  PS> $dir Directory: C:\Users\john\sandbox\tmp2 Mode LastWriteTime Length Name --- ------------- ------ ---- --- 12/19/2017 1:26 PM xyz3  PS> mkdir xyz4 Directory: C:\Users\john\sandbox\tmp2 Mode LastWriteTime Length Name --- ------------- ------ ---- --- 12/19/2017 1:26 PM xyz4 

Было бы хорошо, если бы назначение переменной было отдельным от out-default. Потому что тогда вы можете просто оставить out-default назначенным out-null для всего сценария, не беспокоясь о нарушении сценария.

ИМХО, вы должны заменить `#nothing на возвращаемое!` На `#nothing на отображаемое!`, Поскольку `$ dir` имеет значение, возвращаемое из` mkdir xyz2`, но это значение не отображается. Также, если вы хотите определить функцию, которая ничего не делает, тогда вам не нужно `$ input | out-null` part: `function out-default {}`. PetSerAl 6 лет назад 0