2010-09-21 4 views
8

Ich schreibe ein Skript, um VMs zu erstellen, und natürlich möchte ich die Standard-Confirm/Whatf-Semantik unterstützen. Wenn ich jedoch mehrere Maschinen erstellen muss, wäre es gut, wenn ich zwischen "Ja" und "Ja für alle" unterscheiden könnte, so dass ich nicht unbedingt jede Maschine neu bestätigen muss.

$ pscmdlet.ShouldProcess gibt nur einen booleschen Wert zurück. Wie kann ich den Unterschied feststellen?

+0

Ich könnte $ psCmdlet.ShouldContinue (string, caption, yesToAll, noToAll) aber das confirmImpact und wasif nicht unterstützen. – user103633

+0

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

Antwort

9

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.

+0

Ich bin vollkommen klar auf die Umsetzung, danke. Was mir aus den Dokumenten nicht klar war, ist, dass dies * immer * im Zusammenhang mit einer Pipeline zu erwarten ist. – user103633

+0

Der Pipeline-Kommentar bezieht sich nur auf mein Beispiel. Sie können es auch ohne Pipeline tun, wo alle Eingaben als Argument übergeben werden. Mein Hauptpunkt ist, dass die Funktion nur einmal aufgerufen wird, damit sie den Status behalten kann. – x0n

+3

Ich habe einen Code, wo ich den 'ShouldProcess' nicht in die äußere Schleife setzen konnte, sondern stattdessen in der inneren Funktion. Also übergab ich $ pscmdlet an die innere Funktion und nannte stattdessen 'ShouldProcess'. Dann wird der Zustand im Kontext der äußeren Schleife gespeichert, und Ja/Nein-alles funktioniert. – scobi

Verwandte Themen