Захват подробного потока без включения -Verbose

Возможно, в PowerShell это невозможно сделать.

Если у меня есть файл verboseTest.ps1

[CmdletBinding()]    # CmdletBinding attribute enables -verbose flag
Param()
Write-Verbose 'verbose test'

Если я позвоню .\verboseTest.ps1, я не увижу ничего, как ожидалось.

Если я позвоню .\verboseTest.ps1 -Verbose, я увижу вывод.

VERBOSE: подробный внешний тест

как и ожидалось.

Но если я позвоню .\verboseTest.ps1 4>&1, я не позвоню. Многословный поток потерян.

Теперь Info ведет себя совершенно по-другому.

У меня есть файл infoTest.ps1 и он ведет себя вменяемо.

[CmdletBinding()]    # Add CmdletBinding attribute
Param()
Write-Information 'info test outer'

Если я позвоню .\infoTest.ps1, я не увижу ничего, как ожидалось.

Если я вызову .\infoTest.ps1 -InformationAction 'Continue', аналогичный флагу -Verbose, он преуспеет и выведет info test outer на консоль.

И если я вызову .\infoTest.ps1 6>&1, он также выведет info test outer на консоль! Так что как-то "информационный" поток ведет себя совершенно иначе, чем "многословный" поток.

Поведение информационного потока имеет смысл. Команды записи информации записывают в поток, и я могу перенаправить его или просмотреть или нет, как я считаю нужным. В "многословном" нет! Я должен включить отображение его на выходе, чтобы перенаправить его? Я делаю что-то неправильно? Как это понять?

Должен ли я должен включать подробные настройки для перенаправления вывода? И если да, могу ли я сделать это внутри метода или он меняет его глобально для всего сеанса?


person Pxtl    schedule 27.06.2019    source источник


Ответы (1)


К сожалению, подробный поток (номер потока 4) не просто молчит, когда он явно не включен, но и в него не записываются данные.

То есть операторы Write-Verbose являются эффективными без операций[1], если только не передается -Verbose или для переменной предпочтения $VerbosePreference установлено значение Continue.


Среди автоматических потоков вывода PowerShell по умолчанию — подробного (4), отладочного (5) и информационного (6) — информационный поток является единственным исключением: Write-Information операторы всегда пишут в него, независимо от того, отключена она или нет.


Установка для переменной предпочтения $VerbosePreference значения Continue включает подробный вывод для всех команд в текущей области и любых дочерних областях, но есть важное исключение:

Расширенные функции, реализованные в модулях, при вызове из скрипта видят только глобальный экземпляр $VerbosePreference; бинарные командлеты, напротив, не затронуты. Это крайне проблематичное поведение обсуждается в этой проблеме GitHub.

Вы можете обойти эту проблему следующим образом:

# Create a script-local copy of the global parameter-defaults
# hashtable.
# Note: If you want to clear the global presets, call .Clear()
#       after cloning.
$PSDefaultParameterValues = $PSDefaultParameterValues.Clone()

# Preset the -Verbose switch for all commands that support it.
$PSDefaultParameterValues['*:Verbose'] = $true

# ... call commands, which will behave as if -Verbose had been passed.

[1] Тем не менее, командлет по-прежнему вызывается, что означает, что аргументы, которые вы ему передаете, оцениваются, поэтому гипотетически тихий вызов Write-Verbose все еще может иметь побочные эффекты, такие как при передаче расширяемой строки в качестве сообщения, содержащего подвыражение ($(...)) с побочными эффектами.

person mklement0    schedule 27.06.2019