Powershell 中的 Write-Verbose 与 Write-Host

Write-Verbose vs Write-Host in powershell

当我在 powershell 命令 Write-Verbose 中使用 Write-Verbose 时,我在控制台中没有得到任何信息。然而,它被我团队中的 devops 工程师用于持续集成、构建脚本。

Write-VerboseWrite-Host有什么区别

Write-Verbose 仅在使用 -Verbose 参数时写入控制台。

Write-Host 无论如何写入控制台...

您需要在 Param 部分之前将 [CmdletBinding()] 添加到文件中以启用 -Verbose 参数...

参见示例:

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

PS C:\> .\test.ps1
Host
PS C:\> .\test.ps1 -Verbose
VERBOSE: Verbose
Host
-Verbose 开关传递给 cmdlet 时,

Write-Verbose 仅是 "active" - 否则,假定您不希望看到原本会显示的消息已生成。

Write-Host无条件输出其数据,绕过PowerShell管道。

查看定义

Write-Verbose Writes text to the verbose message stream.

Write-Host Writes customized output to a host.

我认为您的开发运营工程师会在 运行 他们的脚本之前设置 $VerbosePreference = "Continue",因此 Verbose 日志也会输出到控制台。

我们来看一个例子

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

要记住的重要一点是 Write-VerboseWrite-Error 等 cmdlet 用于提供不同的 日志记录级别 即当您正在监视日志并希望按日志级别进行过滤。这会回答诸如“我们得到了多少错误?”(Write-Error)、“是否正在调用此函数?”等问题。 (Write-Debug)

相比之下,Write-Host 通常用于向用户显示有关 cmdlet 进度的“输出”、要求输入等。

参考文献:

  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

cmdlet 之间的区别(截至 )是它们使用哪个流来显示信息。默认情况下,详细流 (4) 不可见 除非 您指定 -Verbose,使用 $PSDefaultParameterValues 自动字典添加 -Verbose 以附加开关到所有或特定的 cmdlet,或设置 $VerbosePreference 自动变量。

您可以这样观察此流行为:

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

同样,Write-Host cmdlet 使用默认情况下也不可见的信息流 (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