PowerShell-Richtlinien für -Confirm, -Force und -WhatIf

8

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:

-WhatIf

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?

-Force

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?

-Bestätigen

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:

  • Wann sollte -WhatIf / -Confirm ?
  • hinzugefügt werden?
  • Wann sollte -Force hinzugefügt werden?
  • Ist es sinnvoll, sowohl -Confirm als auch -Force ?
  • zu unterstützen
Chris Smith 12.01.2016, 16:49
quelle

3 Antworten

5

Ich habe nicht untersucht, ob die Dokumentation so detailliert ist, aber die folgenden basieren auf meinen Beobachtungen:

  1. 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?).

  2. -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.

  3. -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.

Bill_Stewart 12.01.2016, 17:47
quelle
1

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: Ссылка

    
oɔɯǝɹ 21.07.2016 08:53
quelle
0

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%     
oɔɯǝɹ 21.07.2016 08:44
quelle

Tags und Links