Hier ist ein Beispiel-Funktion, die Pipeline-Eingang für den Computernamen akzeptiert und implementiert das Verhalten, das Sie sich wünschen:
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
Wenn Sie mit „Ja“ beantworten, werden Sie für die nächste Maschine aufgefordert. Wenn Sie "Ja zu allen" antworten, werden Sie nicht mehr dazu aufgefordert. Der wichtige Teil ist, dass Sie Pipelineinput verwenden - dies bewirkt, dass die Funktion als Ganzes ausgeführt wird nur einmal, aber der Prozessblock innerhalb der Funktion wird einmal für jedes eingehende Element in der Pipeline aufgerufen. Dadurch wird das "Ja für alle" gespeichert und bei nachfolgenden Prozessblockaufrufen wird keine Eingabe angefordert. Sinn ergeben?
UPDATE: Es ist nicht erforderlich, eine Pipeline dafür zu verwenden. Wichtig ist, dass die Funktion in der Lage sein muss, den Zustand beizubehalten, also würde das Übergeben aller Eingaben in einem Array oder einer Sammlung als Parameter ebenfalls funktionieren. In diesem Fall würden Sie die $ Computer-Sammlung selbst durchlaufen. Mit einer Pipeline läuft die Shell effektiv für Sie.
Ich könnte $ psCmdlet.ShouldContinue (string, caption, yesToAll, noToAll) aber das confirmImpact und wasif nicht unterstützen. – user103633
Oh, und noch etwas - ich hatte gehofft, Ja gegen Ja zu verwenden, um eine zusätzliche Bestätigung anzufordern, wenn der Benutzer beim Erstellen vieler VMs in einer Situation mit geringen Ressourcen unbekümmert zu sein schien. Ich denke, das ist in diesem Fall nicht machbar. – user103633