我正在编写一个用于创建VM的脚本,显然我想支持标准的confirm / whatif语义。但是,如果我要创建一些机器,那么如果我可以区分“是”和“全是”这样会很好,所以我不一定要重新确认每台机器。
$ pscmdlet.ShouldProcess只返回一个布尔值,那我怎么能区分呢?
答案 0 :(得分:9)
这是一个示例函数,它接受计算机名称的管道输入并实现您想要的行为:
function set-something {
[cmdletbinding(SupportsShouldProcess=$true)]
param(
[parameter(position=0, valuefrompipeline=$true)]
$Computer,
[parameter(position=1)]
$Value
)
process {
if ($pscmdlet.shouldprocess("Are you sure?")) {
write-host "setting machine $computer to $value"
}
}
}
"srv1","srv2","srv3" | set-something -value 42 -confirm
如果您回答“是”,系统将提示您输入下一台机器。如果您回答“是的全部”,则不再提示您。重要的是你使用管道输入 - 这导致函数作为一个整体只执行一次,但函数内的进程块被调用一次每个传入管道中的元素。这让它记住“对所有人都是”,并且不会在后续进程块调用时提示。有意义吗?
更新:不需要使用管道来实现此目的。重要的是该函数必须能够保持状态,因此将数组或集合中的所有输入作为参数传递也会起作用。在这种情况下,您将自己遍历$ computer集合。有了管道,shell就会为你循环。