默认情况下,任何具有[CmdletBinding()]属性的命名函数都接受-debug和-verbose(以及其他一些)参数,并具有预定义的$ debug和$ verbose变量.我想弄清楚的是如何将它们传递给在函数内调用的其他cmdlet.
假设我有一个像这样的cmdlet:
function DoStuff() {
[CmdletBinding()]
PROCESS {
new-item Test -type Directory
}
}
Run Code Online (Sandbox Code Playgroud)
if -debug或者-verbose传入我的函数我想将该标志传递给$debugcmdlet.这样做的正确模式是什么?
-WhatIfTL;DR:为什么从脚本调用时模块函数不会隐式继承?
据我了解,cmdlet 和函数将继承诸如-WhatIf调用脚本之类的开关,但是我看到的行为表明情况并非总是如此。我已确认如何在调用其他 Cmdlet 的 Cmdlet 中支持 PowerShell 的 -WhatIf 和 -Confirm 参数?对我来说工作正常,但是当我的脚本调用模块中定义的函数时,问题似乎发生了。
就我而言,我有一个脚本,其中包含本地定义的函数(即在 PS1 中)文件。该脚本导入一个脚本模块。当我使用开关运行主脚本时-WhatIf,本地函数继承-WhatIf状态,但模块函数不会表现出“WhatIf”行为,这可能是灾难性的。
如果我显式调用开关集Show-WhatIfOutput,-WhatIf它会按预期工作。
如果我将Call-ShowWhatIf函数从脚本移动到模块并使用它,Call-ShowWhatIf -WhatIf它就可以正常工作。也就是说,Show-WhatIfOutput确实已-WhatIf隐式设置,但这不是我可以在实际情况中使用的解决方案。
更简单的是,如果我启用SupportsShouldProcess在主脚本上启用,则会出现相同的模式:本地函数将继承开关;但是,模块功能不会。
-WhatIf为什么从脚本调用模块函数时不继承?
测试-WhatIf.psm1
function Show-WhatIfOutput {
[CmdletBinding(SupportsShouldProcess)]
param(
)
Write-Host $MyInvocation.Line.Trim()
if($PSCmdlet.ShouldProcess("My host","Display WhatIf text")){
Write-Warning "This is not WhatIf text!"
}
Write-Host ("-"*40)
}
Run Code Online (Sandbox Code Playgroud)
测试-WhatIf.ps1
Import-Module C:\Test-WhatIf.psm1 -Force
function Call-ShowWhatIf {
[CmdletBinding(SupportsShouldProcess)]
param(
)
Write-Host …Run Code Online (Sandbox Code Playgroud)