Write-Verbose vs Write-Host в powershell - PullRequest
1 голос
/ 02 апреля 2019

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

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

Ответы [ 4 ]

5 голосов
/ 02 апреля 2019

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

Youможно дополнительно наблюдать за этими объектами, присваивая их выходные данные:

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

1 голос
/ 02 апреля 2019

Просмотр определений

Write-Verbose Запись текста в поток подробных сообщений.

Write-Host Запись пользовательскихвывод на хост.

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

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

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

0 голосов
/ 02 апреля 2019

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

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

0 голосов
/ 02 апреля 2019

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...