【问题标题】:Can I support "WhatIf" without it applying to all of the cmdlets I call?我是否可以支持“WhatIf”而不将其应用于我调用的所有 cmdlet?
【发布时间】:2018-04-20 02:00:18
【问题描述】:

我有一个 PowerShell 脚本,它做了很多事情(从 Git 中检查一些配置,比较一些文件,确定是否创建一个包,上传它,然后自行清理)。

我想支持 WhatIf 功能 - 但 用于功能的主要部分 - 脚本需要创建临时文件夹、检查配置并自行清理。我只希望 WhatIf 影响它是否创建/上传包。

但是,如果我将 [CmdletBinding(SupportsShouldProcess)] 放入函数的标头中,则意味着支持 WhatIf 的每个 cmdlet 调用都不会运行(这会在调用链的整个过程中发生。

有没有什么办法可以说“运行除了我在pscmdlet.ShouldProcess 中的代码之外的所有东西”?

【问题讨论】:

  • 我建议提供一个示例脚本来展示您想要的行为并解释您想要发生的事情。
  • 不确定你在问什么?

标签: powershell


【解决方案1】:

为了使其按您期望的方式工作,您必须了解这两个参数如何影响函数范围内的首选项变量。

使用-WhatIf 运行高级功能会将$WhatIfPreference 设置为$true - 为了避免更改命令的行为,您需要将其设置回$false,或者运行SupportShouldProcess-WhatIf:$false 的所有命令.

使用-Confirm 运行高级功能会将$ConfirmPreference 设置为“低”(因此SupportsShouldProcess 将提示的任何内容)-为避免更改命令的行为,您需要将其设置回“高”,或运行任何命令SupportsShouldProcess-Confirm:$false

清除两个标志的示例代码(并仅在您喜欢这样做时提示/返回 WhatIf 消息):

function Invoke-WhatIf {
    [CmdletBinding(
            SupportsShouldProcess
    )]
    param ()
    $WhatIfPreference = $false
    $ConfirmPreference = 'High'
    $null = New-Item -Path $env:TEMP\so.tmp -Force
    if ($PSCmdlet.ShouldProcess('whatIf message','confirm message','confirmCaption')) {
        Remove-Item $env:TEMP\so.tmp -Force
    }
}

阅读更多about_Preference_Variables

【讨论】:

    猜你喜欢
    • 2023-02-07
    • 2011-11-03
    • 2021-10-10
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多