我编写了自己的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。
非常感谢您的回答!
答案 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-Host
:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-verbose?view=powershell-7.1