Возможно, в PowerShell это невозможно сделать.
Если у меня есть файл verboseTest.ps1
[CmdletBinding()] # CmdletBinding attribute enables -verbose flag
Param()
Write-Verbose 'verbose test'
Если я позвоню .\verboseTest.ps1, я не увижу ничего ожидаемого.
Если я позвоню .\verboseTest.ps1 -Verbose, я увижу результат.
VERBOSE: verbose test outer
как и ожидалось.
Но если я позвоню .\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 на консоль! Так что как-то "информационный" поток ведет себя совершенно иначе, чем "многословный" поток.
Поведение информационного потока имеет смысл. Команды записи информации записывают в поток, и я могу перенаправить его или просмотреть или нет, как я считаю нужным. В "многословном" нет! Я должен включить отображение его на выходе, чтобы перенаправить его? Я делаю что-то неправильно? Как это понять?
Должен ли я имеют включить подробное предпочтение для перенаправления вывода? И если да, могу ли я сделать это внутри метода или он меняет его глобально для всего сеанса?





К сожалению, подробный поток (номер потока 4) не просто тихий, когда он не включен явно, а в него не записываются данные.
То есть операторы Write-Verbose действуют как нет операций[1], если только не передан -Verbose или для переменной предпочтения $VerbosePreference установлено значение Continue.
Среди автоматических потоков вывода PowerShell по умолчанию — подробный (4), отладочный (5) и информационный (6) — информационный поток является единственным исключением: в него записываются операторы всегда, независимо от того, заглушен он или нет.
Установка переменной предпочтения Write-Information на $VerbosePreference включает подробный вывод для всех команд в текущей области и любых дочерних областях. - но есть важное исключение:
Расширенные функции, реализованный в модули, видит только экземпляр ГлобальныйContinue при вызове из скрипта; напротив, двоичные командлеты затронуты нет.
Это весьма проблематичное поведение обсуждается в эта проблема 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] However, the cmdlet is still called, which means that arguments you pass to it are evaluated, so it is hypothetically still possible for a silent $VerbosePreference call to have side effects, such as when passing an expandable string as the message that contains a subexpression (Write-Verbose) with side effects.