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

u0njafvf  于 2023-03-18  发布在  Shell
关注(0)|答案(5)|浏览(154)

我已经编写了自己的Powershell日志函数Log,其中包含参数stream(在哪个流上写入消息)和message(要写入的消息)。
我的想法是我可以将输出写入控制台和日志文件,我在函数中所做的基本上是确定在哪个流上发布消息(使用switch语句),然后将消息写入流和日志文件:

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

现在的问题是,是否可以检查是否给出了-Verbose参数?
目标是仅在给定-Verbose时才将消息写入日志文件。
我已经看了以下帮助文档,但没有找到任何有用的:

  • 关于参数的帮助
  • 关于_公共参数的帮助
    此外,-WhatIf参数不适用于Write-Verbose。
    非常感谢您的回答!
w6lpcovy

w6lpcovy1#

在您的脚本中检查以下内容:

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

4zcjmb1e2#

还可提供:检查参数“$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中的“获取关于_CommonParameters的帮助”。

3yhwsihp

3yhwsihp3#

更一般地说:因为你可以在命令行中指定-Verbose:$false,下面的代码可以处理这种情况。2它也适用于任何其他的开关参数:

$Verbose = $false
if ($PSBoundParameters.ContainsKey('Verbose')) { # Command line specifies -Verbose[:$false]
    $Verbose = $PsBoundParameters.Get_Item('Verbose')
}
nnsrf1az

nnsrf1az4#

偶然发现这个寻找相同的答案,并发现了一些好的信息,也有一些不太好。标记的答案似乎是过时的,不像注解所说的那样正确。来自MyInvocation对象的PSBoundParameter属性对象是一个字典(PoSH 5.1以上版本可能没有检查),它不包含IsPresent属性。请求者也忘记考虑$VerbosePreference(其他答案已提供此选项)。
下面是一个简单易行的解决方案:

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

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

cnh2zyt3

cnh2zyt35#

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

相关问题