是否可以检查Powershell中是否给出了-Verbose参数?

时间:2014-06-27 07:51:01

标签: powershell

我编写了自己的Powershell日志记录函数Log,参数stream(写入消息的流)和message(要写的消息)。

我的想法是我可以将输出写入控制台和日志文件。我在函数中做的基本上是确定发布消息的流(使用switch语句),然后将消息写入流和日志文件:

switch ($stream) {
    Verbose {
        Write-Output "$logDate [VERBOSE] $message" | Out-File -FilePath $sgLogFileName -Append
        Write-Verbose $message
        break
    }
}

现在的问题是,是否有可能检查是否给出了-Verbose参数?

目标是仅在给出-Verbose时才将消息写入日志文件。

我已经查看了以下帮助文档,但没有找到任何帮助:
- 帮助about_Parameters
- 帮助about_commonparameters

此外,-WhatIf参数不适用于Write-Verbose。

非常感谢您的回答!

4 个答案:

答案 0 :(得分:20)

在脚本中检查:

$PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent

答案 1 :(得分:17)

同样可用:检查参数'$ VerbosePreference'。如果设置为'SilentlyContinue',则命令行不会给出$ Verbose。如果设置为'$ Continue',那么您可以假设它已设置。

也适用于以下其他常见参数:

Name                           Value
----                           -----
DebugPreference                SilentlyContinue
VerbosePreference              SilentlyContinue
ProgressPreference             Continue
ErrorActionPreference          Continue
WhatIfPreference               0
WarningPreference              Continue
ConfirmPreference              High

Taken from an MSDN blog page from long ago...所以它应该与相对旧版本的Powershell相关。另请参阅Powershell v4中的“Get-Help about_CommonParameters”。

答案 2 :(得分:1)

遇到这个寻找相同的答案并找到了一些很好的信息,也有一些不太好。 标记的答案似乎已过时,并且如评论所述不正确。来自 MyInvocation 对象的 PSBoundParameter 属性对象是一个不包含 IsPresent 属性的字典(PoSH 5.1 之前可能没有检查)。提问者还忘记考虑 $VerbosePreference ,其他答案已提供此选项。

这是一个简单易行的解决方案:

if ( $PSBoundParameters['Verbose'] -or $VerbosePreference -eq 'Continue' ) {
   # do something
}

$PSBoundParameters 是一个哈希表对象,如果该值存在且为真,则计算结果为真,如果不存在或存在且不为真,则计算结果为假。当值为 Continue 时,在会话级别设置的 VerbosePreference 将显示详细语句。使用逻辑或将这些放在一个条件中,如果需要详细输出,您将获得准确的表示。

答案 3 :(得分:-2)

如果您根据 -Verbose 参数的值确定是否打印,请考虑使用 Write-Verbose 而不是 Write-Hosthttps://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-verbose?view=powershell-7.1