Write-Verbose против Write-Host в powershell

Пока я использую Write-Verbose в командном окне powershell, я ничего не получаю в консоли. Однако он используется devops-инженерами в моей команде для непрерывной интеграции, создания скриптов.

В чем разница между Write-Verbose и Write-Host

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
10 052
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Write-Verbose Запись в консоль только при использовании -Verbose Параметры.

Write-Host Все равно пиши в консоль...

Вам нужно добавить [CmdletBinding()] в файл перед разделом Param, чтобы включить параметр -Verbose...

См. пример:

[CmdletBinding()]
Param(
)
Write-Verbose "Verbose"
Write-Host "Host"

PS C:\> .\test.ps1
Host
PS C:\> .\test.ps1 -Verbose
VERBOSE: Verbose
Host

Write-Verbose является «активным» только тогда, когда переключатель -Verbose передается командлету — в противном случае предполагается, что вы не хотите видеть сообщения, которые в противном случае были бы сгенерированы.

Write-Host безоговорочно выводит свои данные и обходит конвейер PowerShell.

Глядя на определения

Write-Verbose Writes text to the verbose message stream.

Write-Host Writes customized output to a host.

Думаю, ваши devops-инженеры установили бы $VerbosePreference = "Continue" перед запуском своих скриптов, из-за чего логи Verbose тоже выводятся на консоль.

Давайте посмотрим на пример

PS > Write-Verbose "hello"
> NO OUTPUT
PS > Write-Host "hello"
hello
PS >  $VerbosePreference = "Continue"
PS > Write-Verbose "hello"
VERBOSE: hello

Важно помнить, что такие командлеты, как Write-Verbose, Write-Error и т. д., предназначены для предоставления различных уровни ведения журнала, т. е. это полезно, когда вы отслеживаете журналы и хотите фильтровать их на уровне журнала. Это отвечает на такие вопросы, как «Сколько ошибок мы получили?» (Write-Error), «Вызывается ли эта функция?» (Write-Debug)

Напротив, Write-Host обычно может использоваться для показа пользователю «Выходных данных» о ходе выполнения командлета, запроса ввода и т. д.

Использованная литература:

  1. https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-host?view=powershell-6

  2. https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-verbose?view=powershell-6

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

Разница между командлетами (начиная с ) заключается в том, какой поток они используют для отображения информации. По умолчанию подробный поток (4) не виден пока не, который вы указываете -Verbose, добавляете -Verbose с помощью автоматического словаря $PSDefaultParameterValues, чтобы добавить переключатель ко всем или определенным командлетам, или устанавливаете автоматическую переменную $VerbosePreference.

Вы можете наблюдать это поведение потока как таковое:

PS ~/> Write-Verbose -Message 'Just testing' -Verbose 4>$null
PS ~/> Write-Verbose -Message 'Just testing' -Verbose
VERBOSE: Just testing

Аналогично командлет Write-Host использует информационный поток (6), который по умолчанию также не виден, но Write-Host по сути стал оболочкой для

Write-Information -InformationAction Continue

Этот поток имеет те же требования, что и поток Verbose, чтобы быть видимым с переменной предпочтения, равной $InformationPreference.

Вы можете дополнительно наблюдать за этими объектами, назначив их вывод:

PS ~/> $output = Write-Verbose -Message test -Verbose 4>&1
PS ~/> $output | Get-Member

   TypeName: System.Management.Automation.VerboseRecord
Name                  MemberType   Definition
----                  ----------   ----------
Equals                Method       bool Equals(System.Object obj)
GetHashCode           Method       int GetHashCode()
GetType               Method       type GetType()
ToString              Method       string ToString()
WriteVerboseStream    NoteProperty bool WriteVerboseStream=True
InvocationInfo        Property     System.Management.Automation.InvocationInfo InvocationInfo {get;}
Message               Property     string Message {get;set;}
PipelineIterationInfo Property     System.Collections.ObjectModel.ReadOnlyCollection[int] PipelineIterationInfo

PS ~/> $output = Write-Host -Object test 6>&1
PS ~/> $output | Get-Member

   TypeName: System.Management.Automation.InformationRecord
Name                   MemberType   Definition
----                   ----------   ----------
Equals                 Method       bool Equals(System.Object obj)
GetHashCode            Method       int GetHashCode()
GetType                Method       type GetType()
ToString               Method       string ToString()
WriteInformationStream NoteProperty bool WriteInformationStream=True
Computer               Property     string Computer {get;set;}
ManagedThreadId        Property     uint ManagedThreadId {get;set;}
MessageData            Property     System.Object MessageData {get;}
NativeThreadId         Property     uint NativeThreadId {get;set;}
ProcessId              Property     uint ProcessId {get;set;}
Source                 Property     string Source {get;set;}
Tags                   Property     System.Collections.Generic.List[string] Tags {get;}
TimeGenerated          Property     datetime TimeGenerated {get;set;}
User                   Property     string User {get;set;}

Допустимые значения для переменных предпочтений:

[System.Management.Automation.ActionPreference].GetEnumValues()

about_Redirection

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

Проблема со скоростью при операции -match для большого текстового файла
Как написать модуль Runbook для изменения следующего перехода UDR, если время ожидания IP-адреса конкретной виртуальной машины истекло в Azure
Подходит ли использование Select-Object, когда у вас нет доступа к -Extension?
Как правильно использовать «Сжатие-архив»? В сообщении об ошибке постоянно говорится: «Путь не существует или не является допустимым путем к файловой системе»
Создание скрипта для проверки LastWriteTime, если более 12 часов "Сделайте что-нибудь"
Цикл foreach не работает в цикле do while
Как извлечь значение узла xml в переменную в powershell?
Нужен код для замены всех слов в текстовом файле, который заканчивается символами КБ
Соответствие обозначения номера Powershell и логика переименования элемента
Обработка нескольких CSV-файлов и сохранение данных в отдельных текстовых файлах (удаление пробелов и новых строк) с помощью Powershell