Захватить подробный поток без включения -Verbose - PullRequest
1 голос
/ 27 июня 2019

Возможно, в 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 на консоль!Так что каким-то образом «информационный» поток ведет себя совершенно иначе, чем «подробный».

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

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

1 Ответ

4 голосов
/ 28 июня 2019

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

То есть действуют Write-Verbose операторы no-ops [1] , если только не передано -Verbose или не установлена ​​переменная предпочтения $VerbosePreferenceContinue.


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

Расширенные функции реализовано в модулях видеть только global экземпляр $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 имел побочные эффекты, напримеркак при передаче расширяемой строки в качестве сообщения, которое содержит подвыражение ($(...)) с побочными эффектами.

...