我一直在尝试使用ShouldProcess方法编写支持-whatif的安全代码,以便我的用户在实际运行cmdlet之前先了解一下该cmdlet应该做什么。

但是,我遇到了一些麻烦。如果我使用-whatif作为参数调用脚本,则$ pscmdlet.ShouldProcess将返回false。一切都很好。如果我调用在同一文件(具有SupportsShouldProcess = $ true)中定义的cmdlet,则该cmdlet也将返回false。

但是,如果我调用使用Import-Module加载的另一个模块中定义的cmdlet,它将返回true。 -whatif上下文似乎没有传递给另一个模块中的调用。

我不想手动将标志传递给每个cmdlet。有谁有更好的解决方案?

这个问题似乎与此question有关。但是,他们并不是在谈论跨模块问题。

示例脚本:

#whatiftest.ps1
[CmdletBinding(SupportsShouldProcess=$true)]
param()

Import-Module  -name .\whatiftest_module  -Force

function Outer
{
    [CmdletBinding(SupportsShouldProcess=$true)]
    param()
    if( $pscmdlet.ShouldProcess("Outer"))
    {
        Write-Host "Outer ShouldProcess"
    }
    else
    {
        Write-Host "Outer Should not Process"
    }

    Write-Host "Calling Inner"
    Inner
    Write-Host "Calling InnerModule"
    InnerModule
}

function Inner
{
    [CmdletBinding(SupportsShouldProcess=$true)]
    param()

    if( $pscmdlet.ShouldProcess("Inner"))
    {
        Write-Host "Inner ShouldProcess"
    }
    else
    {
        Write-Host "Inner Should not Process"
    }
}

    Write-Host "--Normal--"
    Outer

    Write-Host "--WhatIf--"
    Outer -WhatIf

模块:
#whatiftest_module.psm1
 function InnerModule
 {
    [CmdletBinding(SupportsShouldProcess=$true)]
    param()

    if( $pscmdlet.ShouldProcess("InnerModule"))
    {
        Write-Host "InnerModule ShouldProcess"
    }
    else
    {
        Write-Host "InnerModule Should not Process"
    }
 }

输出:
F:\temp> .\whatiftest.ps1
--Normal--
Outer ShouldProcess
Calling Inner
Inner ShouldProcess
Calling InnerModule
InnerModule ShouldProcess
--WhatIf--
What if: Performing operation "Outer" on Target "Outer".
Outer Should not Process
Calling Inner
What if: Performing operation "Inner" on Target "Inner".
Inner Should not Process
Calling InnerModule
InnerModule ShouldProcess

最佳答案

为此,您可以使用一种称为“CallStack偷看”的技术。使用Get-PSCallStack查找称为该函数的内容。每一项将具有一个InvocationInfo,其内部将是一个称为“BoundParameters”的属性。每个级别都有参数。如果-WhatIf传递给了他们中的任何一个,则您可以像-WhatIf传递给您的函数一样。

希望这可以帮助

关于powershell - Powershell:如何获取-whatif传播到另一个模块中的cmdlet,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7984876/

10-13 09:28