- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
TL;DR:为什么模块函数在从脚本调用时不隐式继承 -WhatIf
?
据我了解,cmdlet 和函数将从调用脚本继承诸如 -WhatIf
之类的开关,但是我看到的行为表明情况并非总是如此。我已确认 How do you support PowerShell's -WhatIf & -Confirm parameters in a Cmdlet that calls other Cmdlets? 中的示例对我来说工作正常,但问题似乎发生在我的脚本调用模块中定义的函数时。
在我的例子中,我有一个脚本,其中包含一个在本地(即在 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)
}
测试-WhatIf.ps1
Import-Module C:\Test-WhatIf.psm1 -Force
function Call-ShowWhatIf {
[CmdletBinding(SupportsShouldProcess)]
param(
)
Write-Host "$($MyInvocation.Line.Trim()) > " -NoNewline
Show-WhatIfOutput
Write-Host "$($MyInvocation.Line.Trim()) > " -NoNewline
Show-WhatIfOutput -WhatIf
}
Write-Host ("-"*40)
Show-WhatIfOutput
Show-WhatIfOutput -WhatIf
Call-ShowWhatIf
Call-ShowWhatIf -WhatIf
将这两个文件保存到(比方说)C:\
并运行 PS1 脚本。我收到的输出是:
----------------------------------------
Show-WhatIfOutput
WARNING: This is not WhatIf text!
----------------------------------------
Show-WhatIfOutput -WhatIf
What if: Performing the operation "Display WhatIf text" on target "My host".
----------------------------------------
Call-ShowWhatIf > Show-WhatIfOutput
WARNING: This is not WhatIf text!
----------------------------------------
Call-ShowWhatIf > Show-WhatIfOutput -WhatIf
What if: Performing the operation "Display WhatIf text" on target "My host".
----------------------------------------
Call-ShowWhatIf -WhatIf > Show-WhatIfOutput
WARNING: This is not WhatIf text!
----------------------------------------
Call-ShowWhatIf -WhatIf > Show-WhatIfOutput -WhatIf
What if: Performing the operation "Display WhatIf text" on target "My host".
----------------------------------------
您可以看到,在输出的第二个“ block ”中,我直接调用模块函数并获得 WhatIf 语句。
您可以看到,在输出的第 5 个“ block ”中,我从本地 Call-ShowWhatIf
函数中调用了模块函数,因为得到了 WhatIf 未设置的警告。
最佳答案
来电者 Preference Variables不会从 Call-ShowWhatIf
传播到 Show-WhatIfOutput
。据我所知,这是从模块调用的函数的一个已知问题。在这种情况下,$WhatIfPreference
没有被传播。
将此添加到您的 Show-WhatIfOutput
应该可以解决问题:
if (-not $PSBoundParameters.ContainsKey('WhatIf'))
{
$WhatIfPreference= $PSCmdlet.GetVariableValue('WhatIfPreference')
}
它检查调用者 (Call-ShowWhatIf
) 是否指定了-WhatIf
。当函数调用 (Show-WhatIfOutput
)
-WhatIf
时,它会执行此操作
This is a similar post它描述了与 -Verbose
不传播相同的问题。
相关链接:
PowerShell.org - Script Modules and Variable Scopes
Scripting Guy - Weekend Scripter: Access PowerShell Preference Variables
TechNet - Import Preference variables from the caller of a Script Module function
关于function - PowerShell 模块函数不继承 WhatIf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48421512/
对于下面的这些 cmdlet,我尝试使用 [CmdletBinding(SupportsShouldProcess)] 行创建函数,但不确定它是否有效。 使用:https://learn.micros
对于下面的这些 cmdlet,我尝试使用 [CmdletBinding(SupportsShouldProcess)] 行创建函数,但不确定它是否有效。 使用:https://learn.micros
TL;DR - 当函数/cmdlet 没有 -WhatIf 参数但我如何指定 -WhatIf:$false仍然对父调用中的 -WhatIf 使用react? 考虑以下稍微做作的示例: Import-M
是否可以运行 DSC 配置并从 Set-TargetResource 获取 WhatIf 输出?我编写了一个自定义资源,并且 Set 函数具有 WhatIf/ShouldProcess 工作所需的所有
TL;DR:为什么模块函数在从脚本调用时不隐式继承 -WhatIf? 据我了解,cmdlet 和函数将从调用脚本继承诸如 -WhatIf 之类的开关,但是我看到的行为表明情况并非总是如此。我已确认 H
我一直在尝试使用 ShouldProcess 方法编写支持 -whatif 的安全代码,以便我的用户在真正运行 cmdlet 之前了解它应该做什么。 但是,我遇到了一些障碍。如果我以 -whatif
Powershell 的默认行为似乎是将 -WhatIf 和 -Confirm 传播到从 -WhatIf 或 -Confirm 调用的函数中调用的所有函数。 但是如果(双关语)我不想要呢?如果我只想保
我正在编写一个 Powershell cmdlet,它需要执行命令并将其 stderr 输出存储到临时文件以供以后处理。此输出列出了 cmdlet 稍后可能使用的 COM 端口。 # mostly s
我正在编写一个 PowerShell 脚本,使用 Get-ChildItem 查找目录并将它们传递给 sdelete。我想试运行它。我认为 sdelete 没有 -WhatIf 标志。有什么方法可以实
我想在 PowerShell 中围绕 New-AzResourceGroupDeployment 编写一个包装器。因此,让我们假设以下脚本: New-AzResourceGroupDeployment
我需要编辑我在此处找到的脚本,以便我可以首先看到它将删除的文件的报告,包括文件名和路径以及“LastWriteTime”属性,以便我可以分析脚本的输出在执行之前和我将其配置为计划任务之前的几个月: 我
SO 和其他地方有很多问题解释了如何将 -Confirm 传播到整个 cmdlet 到嵌套的 cmdlet 等。然而,我没有找到的是如何传播 -Confirm em>回应那个提示。也就是说,一旦用户回
Microsoft 是否有关于何时添加 -Confirm 的官方指南? , -Force , 和 -WhatIf自定义 PowerShell cmdlet 的参数?关于何时/如何使用这些参数似乎没有明
我有一个支持 -WhatIf 的 PowerShell 脚本 cmdlet & -Confirm参数。 它通过调用 $PSCmdlet.ShouldProcess() 来做到这一点。执行更改之前的方法
我是一名优秀的程序员,十分优秀!