Powershell 中的 Write-Verbose 与 Write-Host
Write-Verbose vs Write-Host in powershell
当我在 powershell 命令 Write-Verbose
中使用 Write-Verbose
时,我在控制台中没有得到任何信息。然而,它被我团队中的 devops 工程师用于持续集成、构建脚本。
Write-Verbose
和Write-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-Verbose
、Write-Error
等 cmdlet 用于提供不同的 日志记录级别 即当您正在监视日志并希望按日志级别进行过滤。这会回答诸如“我们得到了多少错误?”(Write-Error
)、“是否正在调用此函数?”等问题。 (Write-Debug
)
相比之下,Write-Host
通常用于向用户显示有关 cmdlet 进度的“输出”、要求输入等。
参考文献:
cmdlet 之间的区别(截至 powershell-v5.0)是它们使用哪个流来显示信息。默认情况下,详细流 (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
当我在 powershell 命令 Write-Verbose
中使用 Write-Verbose
时,我在控制台中没有得到任何信息。然而,它被我团队中的 devops 工程师用于持续集成、构建脚本。
Write-Verbose
和Write-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-Verbose
、Write-Error
等 cmdlet 用于提供不同的 日志记录级别 即当您正在监视日志并希望按日志级别进行过滤。这会回答诸如“我们得到了多少错误?”(Write-Error
)、“是否正在调用此函数?”等问题。 (Write-Debug
)
相比之下,Write-Host
通常用于向用户显示有关 cmdlet 进度的“输出”、要求输入等。
参考文献:
cmdlet 之间的区别(截至 powershell-v5.0)是它们使用哪个流来显示信息。默认情况下,详细流 (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()