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





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 обычно может использоваться для показа пользователю «Выходных данных» о ходе выполнения командлета, запроса ввода и т. д.
Использованная литература:
Разница между командлетами (начиная с powershell-v5.0) заключается в том, какой поток они используют для отображения информации. По умолчанию подробный поток (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