Powershell:将数组传递给函数时使用WhatIf

时间:2016-09-03 12:34:25

标签: powershell

我有一个函数可以找到一些XML元素,然后将它们传递给另一个要操作的函数。由于调用外部函数会导致XML数据被更改,我在命名时使用了Set动词。好的做法是将WhatIf用于改变数据的函数。

我遇到的问题是我将一系列XML元素传递给Set-InlineCssStyle,我希望ShouldProcess的输出反映每一项。

我认为代码我想出了气味!

...
if ($WhatIfPreference)
{
    $elements.ForEach({
        if ($PSCmdlet.ShouldProcess($_.Name, 'Set-InlineCssStyle')){}
    })
}
else
{
    Set-InlineCssStyle -Elements $elements -Style $Style
}
...

在将数组传递给函数时,使用WhatIf处理问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您有重复检查。如果您没有使用ShouldProcess(Target,Action)或者您使用-WhatIf并且对该项目回答“是”,则-Confirm仅返回true(将运行if-true-block)。所以整个if($WhatIfPreference) - 部分都不需要。尝试:

function TestWhatIf {
    [CmdletBinding(SupportsShouldProcess=$true)]
    param(
    [Parameter(ValueFromPipeline=$true)]
    $elements
    )

    Process {   
        $elements.ForEach({
            if ($PSCmdlet.ShouldProcess($_.Name, 'Hello')){
                "Hello $($_.Name)"
            }
        })

    }
}

输出:

#WhatIf
>Get-ChildItem | TestWhatIf -WhatIf
What if: Performing the operation "Hello" on target ".dnx".
What if: Performing the operation "Hello" on target ".nuget".
What if: Performing the operation "Hello" on target ".vscode".
What if: Performing the operation "Hello" on target "3D Objects".
What if: Performing the operation "Hello" on target "Base".
....

#Without WhatIf
>Get-ChildItem | TestWhatIf
Hello .dnx
Hello .nuget
Hello .vscode
Hello 3D Objects
Hello Base
....