Powershell脚本支持-verbose

Say*_*imi 21 powershell

我正在创建一个调用的.ps1脚本Write-Verbose.我希望能够启用/禁用这些.

我希望我可以-Verbose在调用脚本时传递标志,一切都会正常工作.不幸的是,情况似乎并非如此.

详细消息不会写入主机.我环顾四周,发现支持-Whatif,-Confirm,-Verbose-在脚本中!

但这是从2007年开始,PS团队成员表示他们正在寻找PS v2的内置支持.

有人对此有任何更新,还是我们必须使用该博客文章中描述的相同技术?

以下是当前行为的示例.

我用以下内容创建了一个简单的脚本ex01.ps1.

Write-Host "line 1"
Write-Verbose "line 2"
Write-Host "line 3"
Run Code Online (Sandbox Code Playgroud)

我首先用脚本执行了脚本.\ex01.ps1,只按预期打印了1和2.然后我用它执行它.\ex01.ps1 -verbose,得到了相同的结果.我期待第二次打印所有3行.

Powershell示例结果

Sha*_*evy 24

要使用Verbose开关,您需要在脚本中指定CmdletBinding属性.要添加对Confirm和WhatIf开关的支持,请添加SupportsShouldProcess属性并在脚本中调用ShouldProcess方法:

## content of .\ex01.ps1 ##
[CmdletBinding(SupportsShouldProcess=$true)]
Param()
Write-Host "line 1"
Write-Verbose "line 2"
Write-Host "line 3"

if($PSCmdlet.ShouldProcess($env:COMPUTERNAME,'Remove X'))
{
    "do something"
}


###########################


PS > .\ex01.ps1
line 1
line 3

PS > .\ex01.ps1 -Verbose
line 1
VERBOSE: line 2
line 3

PS > .\ex01.ps1 -WhatIf
line 1
line 3
What if: Performing operation "Remove X" on Target "PC1".
Run Code Online (Sandbox Code Playgroud)

  • 对于只需要使用-verbose的任何人,您都可以将其放在脚本的顶部:[CmdletBinding()] Param() (2认同)

Ed *_*kes 11

我是一个强大的初学者,但这只是让我失望:

如果您的脚本没有任何参数,则不会传递详细的开关.把它放在脚本的顶部:

[CmdletBinding()]
Param()
Run Code Online (Sandbox Code Playgroud)

所以你的脚本将是:

[CmdletBinding()]
Param()
Write-Host "line 1"
Write-Verbose "line 2"
Write-Host "line 3"
Run Code Online (Sandbox Code Playgroud)


JPB*_*anc 5

您应该了解高级功能:使用高级功能,您可以利用common -verbose参数.只需以这种方式输出详细输出:

Write-Verbose "Text of debug"
Run Code Online (Sandbox Code Playgroud)

当shell的$ VerbosePreference变量未设置为"SilentlyContinue"("Continue"将启用输出)时,您将看到详细的输出.

此Windows IP Pro文章Part1和spcialy Part2描述了使用高级功能可以执行的其他操作.您还可以在PowerShell高级功能指南中找到分步指南