虽然我在Powershell命令窗口中使用Write-Verbose
,但控制台中却没有任何内容。但是我的团队中的devops工程师使用它来进行持续集成,构建脚本。
Write-Verbose
和Write-Host
有什么区别
答案 0 :(得分:5)
cmdlet(自powershell-v5.0起)之间的区别在于它们使用哪个流来显示信息。默认情况下,除非您指定-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-Verbose
,Write-Error
等cmdlet用于提供不同的日志记录级别,即在监视日志和要按日志级别过滤。这回答了诸如“我们遇到了多少错误?”(Write-Error
),“是否正在调用此函数?”之类的问题。 (Write-Debug
)
相反,Write-Host
通常是用于向用户显示cmdlet进度的“输出”,要求输入等。
参考:
答案 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管道。