gpt4 book ai didi

Powershell:如何让 -whatif 传播到另一个模块中的 cmdlet

转载 作者:行者123 更新时间:2023-12-04 12:12:23 25 4
gpt4 key购买 nike

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

但是,我遇到了一些障碍。如果我以 -whatif 作为参数调用脚本,$pscmdlet.ShouldProcess 将返回 false。一切都很好。如果我调用在同一文件中定义的 cmdlet(具有 SupportsShouldProcess=$true),它也会返回 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 peeking”的技术。使用 Get-PSCallStack 查看调用该函数的任何内容。每个项目都有一个 InvocationInfo,其中一个名为“BoundParameters”的属性。这具有@每个级别的参数。如果 -WhatIf 被传递给其中任何一个,你可以像 -WhatIf 被传递给你的函数一样。

希望这可以帮助

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com