【问题标题】:Powershell - how to combine -whatif with a -confirm?Powershell - 如何将 -whatif 与 -confirm 结合使用?
【发布时间】:2016-02-05 05:11:26
【问题描述】:

我在搜索中引用了这个问题:how to use 'dry-run' in powershell,我已经明白了它在说什么。

我的问题是:

我能否拥有一个调用 -whatif 的 Powershell 脚本,然后返回确认提示以运行真正的命令?

一个例子:

#Disable Exchange access
set-casmailbox $1.samaccountname -ewsallowentourage $false -ecpenabled $false -ewsallowoutlook $false -ewsallowmacoutlook $false -activesyncenabled $false -owaenabled $false -OWAforDevicesEnabled $false -mapihttpenabled $false -ewsenabled $false -mapienabled $false

我希望上面包含一个 -WhatIf,然后是一个提示以确认是否运行真正的命令。

我认为我可以通过以下方式稍微草率地做到这一点:

#Check what happens if I disable Exchange Access
set-casmailbox $1.samaccountname -ewsallowentourage $false -ecpenabled $false -ewsallowoutlook $false -ewsallowmacoutlook $false -activesyncenabled $false -owaenabled $false -OWAforDevicesEnabled $false -mapihttpenabled $false -ewsenabled $false -mapienabled $false -whatif
#Prompt for Confirmation to actually disable Exchange Access
set-casmailbox $1.samaccountname -ewsallowentourage $false -ecpenabled $false -ewsallowoutlook $false -ewsallowmacoutlook $false -activesyncenabled $false -owaenabled $false -OWAforDevicesEnabled $false -mapihttpenabled $false -ewsenabled $false -mapienabled $false -confirm

但我很好奇是否有更好的方法,特别是因为上面是一个简单的单行命令而不是 foreach 等。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    这必须在您调用的 cmdlet 中实现。您可以将其与您自己的功能一起破解:

    function Invoke-WhatIfThenConfirm {
    [CmdletBinding(SupportsShouldProcess=$true)]
    param(
        [Parameter(
            Mandatory=$true
        )]
        [ScriptBlock]
        $ScriptBlock ,
    
        [Switch]
        $Force
    )
    
        if ($PSCmdlet.ShouldProcess('Calling scriptblock')) {
            $prefSave = $WhatIfPreference
            try {
                $WhatIfPreference = 'Stop'
                & $ScriptBlock
            } finally {
                $WhatIfPreference = $prefSave
            }
            $confSave = $ConfirmPreference
            try {
                $ConfirmPreference = if ($Force) {
                    'None'
                } else {
                    'High'
                }
                & $ScriptBlock
            } finally {
                $ConfirmPreference = $confSave
            }
        }
    }
    

    然后这样称呼它:

    Invoke-WhatIfThenConfirm -ScriptBlock {
        set-casmailbox $1.samaccountname -ewsallowentourage $false -ecpenabled $false -ewsallowoutlook $false -ewsallowmacoutlook $false -activesyncenabled $false -owaenabled $false -OWAforDevicesEnabled $false -mapihttpenabled $false -ewsenabled $false -mapienabled $false
    }
    

    如果你使用-Force,它应该不会强制确认。

    这整件事只是在这里输入的,我根本没有测试过,所以我不确定它是否会起作用,但这可能是一个很好的起点。


    另类

    您可以使用 splatting 将参数放入哈希表并修改开关:

    $params = @{
        Identity = $1.samaccountname 
        ewsallowentourage = $false 
        ecpenabled = $false 
        ewsallowoutlook = $false 
        ewsallowmacoutlook = $false 
        activesyncenabled = $false 
        owaenabled = $false 
        OWAforDevicesEnabled = $false 
        mapihttpenabled = $false 
        ewsenabled = $false 
        mapienabled = $false
    }
    
    set-casmailbox @params -WhatIf
    set-casmailbox @params -Confirm
    

    第二个选项更简单一些,可能不太容易出错,但最适合在这里或那里调用一个大多数参数不会改变的 cmdlet。

    第一个选项更通用,可以处理许多不同的 cmdlet 并更自然地调用它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-21
      • 2011-11-03
      • 2014-08-30
      • 2023-03-09
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      相关资源
      最近更新 更多