Gibt es offizielle Richtlinien von Microsoft zum Hinzufügen von Parametern für -Confirm
, -Force
und -WhatIf
zu benutzerdefinierten PowerShell-Cmdlets? Es scheint keinen klaren Konsens darüber zu geben, wann / wie diese Parameter zu verwenden sind. Zum Beispiel dieses Problem .
Gibt es in Ermangelung formeller Richtlinien eine bewährte Methode oder Faustregel? Hier ist noch ein Hintergrund mit meinem aktuellen (möglicherweise fehlerhaften) Verständnis:
Das Flag -WhatIf
zeigt an, was das Cmdlet tun würde , ohne tatsächlich eine Aktion auszuführen. Dies ist nützlich für einen Trockenlauf einer potenziell destabilisierenden Operation, um zu sehen, was die tatsächlichen Ergebnisse wären. Der Parameter wird automatisch hinzugefügt, wenn das Attribut Cmdlet
des Cmdlets das SupportsShouldProcess
Eigenschaft auf" True "gesetzt.
Es scheint so (aber ich würde gerne mehr offizielle Anleitung hier sehen), dass Sie -WhatIf
hinzufügen sollten, wenn Sie Ressourcen hinzufügen oder entfernen. (z. B. Dateien löschen.) Operationen, die vorhandene Ressourcen aktualisieren, würden wahrscheinlich nicht davon profitieren. Richtig?
Der Schalter -Force
wird verwendet, um "Ich weiß, was ich mache, und ich bin mir sicher, dass ich das machen möchte" zu deklarieren. Wenn Sie beispielsweise eine Datei kopieren ( Copy-File
), bedeutet der Parameter -Force
:
Ermöglicht dem Cmdlet das Kopieren von Elementen, die nicht anderweitig geändert werden können, z. B. Kopieren über eine schreibgeschützte Datei oder einen Alias.
Für mich scheint es also (ich würde hier wieder eine offizielle Anleitung lieben), dass Sie einen optionalen -Force
-Parameter hinzufügen sollten, wenn Sie eine Situation haben, in der das Cmdlet andernfalls fehlschlagen würde, aber überzeugt werden kann Aktion.
Wenn Sie beispielsweise eine neue Ressource erstellen, die eine vorhandene Ressource mit demselben Namen überlisten soll. Das Standardverhalten des Cmdlets meldet einen Fehler und schlägt fehl. Wenn Sie jedoch -Force
hinzufügen, wird es fortgesetzt (und überschreibt die vorhandene Ressource). Richtig?
Das -Confirm
Flag wird automatisch hinzugefügt wie -WhatIf
wenn das Cmdlet SupportsShouldProcess
auf true gesetzt hat. In einem Cmdlet, wenn Sie ShouldProcess
aufrufen wird der Benutzer dann aufgefordert, die Aktion auszuführen. Und wenn das Flag -Confirm
hinzugefügt wird, wird keine Eingabeaufforderung angezeigt. (d. h. die Bestätigung wird über den Cmdlet-Aufruf hinzugefügt.)
So sollte -Confirm
verfügbar sein, wenn ein Cmdlet große Auswirkungen auf das System hat. Genau wie -WhatIf
sollte dies hinzugefügt werden, wenn eine Ressource hinzugefügt oder entfernt wird.
Angesichts meines möglicherweise falschen Verständnisses hier einige der Fragen, auf die ich eine konkrete Antwort möchte:
-WhatIf
/ -Confirm
? -Force
hinzugefügt werden? -Confirm
als auch -Force
? Ich habe nicht untersucht, ob die Dokumentation so detailliert ist, aber die folgenden basieren auf meinen Beobachtungen:
Sie sollten -WhatIf
für alles verwenden, das eine Änderung vornimmt. Updates sind Änderungen, die von -WhatIf
profitieren können (z. B. was ist, wenn Sie viele Aktualisierungen vornehmen möchten?).
-Force
bedeutet "überschreiben eines vorhandenen Objekts erzwingen" oder "überschreiben eines schreibgeschützten Dateisystemattributs". In jedem Fall hängt der Erfolg der Aktion davon ab, dass der Benutzer die Berechtigung hat.
-Confirm
und -Force
schließen sich nicht gegenseitig aus. Beispielsweise können Sie eine Aktion zum Schreiben einer Datei bestätigen, die Datei ist jedoch möglicherweise mit dem schreibgeschützten Attribut geschützt. In diesem Fall würde die Aktion fehlschlagen, wenn Sie auch -Force
angeben.
Wenn Sie sicherstellen möchten, dass Ihre Implementierung dieser allgemeinen Parameter konform mit den Richtlinien ist (z. B. Set-Xxx-Cmdlets sollten -Confirm und -WhatIf haben), können Sie das hervorragende PsScriptAnalyzer
-Modul verwenden (was basierend auf Code-Analyse).
Stellen Sie sicher, dass das Modul installiert ist:
%Vor%Führen Sie anschließend PowerShell Code Analysis wie folgt aus:
%Vor%Dokumentation (und Quellen) können auf GitHub gefunden werden: Ссылка
Als zusätzliche Beobachtung hebt -Force
-WhatIf
nicht auf. Oder mit anderen Worten: -WhatIf
hat Priorität vor -Force
.
Wenn Sie Folgendes verwenden:
%Vor%ergibt folgende Ausgabe:
Was ist, wenn: Die Operation "Remove Directory" auf dem Ziel "E: \ some directory \" ausgeführt wird.
Es werden die Objekte nicht wirklich entfernt, auch wenn -Force
angegeben ist.
Dies bedeutet, dass Sie niemals schreiben sollten:
%Vor%Tags und Links powershell