Powershell中的Write-Verbose与Write-Host

时间:2019-04-02 11:39:27

标签: powershell

虽然我在Powershell命令窗口中使用Write-Verbose,但控制台中却没有任何内容。但是我的团队中的devops工程师使用它来进行持续集成,构建脚本。

Write-VerboseWrite-Host有什么区别

4 个答案:

答案 0 :(得分:5)

cmdlet(自起)之间的区别在于它们使用哪个流来显示信息。默认情况下,除非您指定-Verbose,否则不显示Verbose流(4),除非您使用-Verbose自动字典添加$PSDefaultParameterValues以将开关附加到全部或特定的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

答案 1 :(得分:1)

查看定义

  

写详细   将文本写到详细消息流中。

     

写主机   将自定义输出写入主机。

我认为您的devop工程师应该在运行脚本之前先设置$VerbosePreference = "Continue",因为这些脚本也会将详细日志输出到控制台。

让我们看一个例子

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

Write-Verbose仅在-Verbose开关传递到cmdlet时才处于“活动”状态-否则,假设您不希望看到将要生成的消息。

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