Powershell $pscmdlet.ShouldProcess(…)返回“;是”;或;“对所有人都是”;

Powershell $pscmdlet.ShouldProcess(…)返回“;是”;或;“对所有人都是”;,powershell,Powershell,我正在编写一个脚本来创建VM,显然我希望支持标准的confirm/whatif语义。然而,如果我有许多机器要创建,如果我能区分“是”和“对所有人都是”,那就好了,这样我就不必再确认每台机器 $pscmdlet.ShouldProcess只返回一个布尔值,那么我如何区分这两者之间的区别呢?下面是一个示例函数,它接受计算机名称的管道输入并实现所需的行为: function set-something { [cmdletbinding(SupportsShouldProcess=$true)]

我正在编写一个脚本来创建VM,显然我希望支持标准的confirm/whatif语义。然而,如果我有许多机器要创建,如果我能区分“是”和“对所有人都是”,那就好了,这样我就不必再确认每台机器


$pscmdlet.ShouldProcess只返回一个布尔值,那么我如何区分这两者之间的区别呢?

下面是一个示例函数,它接受计算机名称的管道输入并实现所需的行为:

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
如果您回答“是”,系统将提示您选择下一台机器。如果您回答“全部是”,将不再提示您。重要的一点是使用管道输入-这会导致函数作为一个整体只执行一次,但函数中的进程块会为管道中的每个传入元素调用一次。这使它能够记住“yes for all”,并且不会在后续进程块调用时提示。有道理吗


更新:这不需要使用管道来工作。重要的是函数必须能够保持状态,因此将数组或集合中的所有输入作为参数传递也会起作用。在这种情况下,您可以自己循环$computer集合。通过管道,可以有效地为您循环shell。

我可以使用$psCmdlet.ShouldContinue(字符串、标题、yesToAll、NotAll),但它不支持confirmImpact和whatif.Oh,还有一件事——我希望使用yes vs yes to all来提示用户进行额外的确认,如果用户在低资源情况下对创建许多虚拟机表现出漫不经心的态度。我想这在这种情况下是不可行的。我完全清楚具体的实施,谢谢。从文档中我不清楚的是,这应该总是在管道上下文中使用。管道注释仅与我的示例有关。您也可以不使用管道来完成,其中所有输入都作为参数传递。我的主要观点是函数只被调用一次,这样它就可以保持状态。我有一些代码,我不能将
ShouldProcess
放在外部循环中,而是希望它放在内部函数中。因此,我将
$pscmdlet
传递给内部函数,并对其调用
ShouldProcess
。然后,状态存储在外部循环的上下文中,yes/no all起作用。