$ pscmdlet.ShouldProcess(...)返回“是”或“全是”

时间:2010-09-21 19:22:20

标签: powershell

我正在编写一个用于创建VM的脚本,显然我想支持标准的confirm / whatif语义。但是,如果我要创建一些机器,那么如果我可以区分“是”和“全是”这样会很好,所以我不一定要重新确认每台机器。

$ pscmdlet.ShouldProcess只返回一个布尔值,那我怎么能区分呢?

1 个答案:

答案 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就会为你循环。