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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
265
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

К сожалению, подробный поток (номер потока 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.

Другие вопросы по теме