我有一个函数可以找到一些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
处理问题的最佳方法是什么?
答案 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
....