13 Stimmen

Powershell-Skripterstellung: Empfohlene Methode zur Implementierung von ShouldProcess, wenn Funktionsaufrufe verschachtelt sind?

Test-Skript:

function outer
{
    [cmdletbinding(supportsshouldprocess=$true)]
    param($s)

    process
    {        
        $pscmdlet.shouldprocess("outer $s", "ShouldProcess") | out-null
        "" | out-file "outer $s"

        inner ImplicitPassthru
        inner VerbosePassthru -Verbose:$Verbose 
        inner WhatifPassthru -WhatIf:$WhatIf
    }
}

function inner
{
    [cmdletbinding(supportsshouldprocess=$true)]
    param($s)

    process
    {   
        $pscmdlet.shouldprocess("inner $s", "ShouldProcess") | out-null
        "" | out-file "inner $s"
    }
}

"`n** NORMAL **"
outer normal
"`n** VERBOSE **"
outer verbose -Verbose
"`n** WHATIF **"
outer whatif -WhatIf

Ausgabe:

** NORMAL **
VERBOSE: Performing operation "ShouldProcess" on Target "inner VerbosePassthru".
What if: Performing operation "ShouldProcess" on Target "inner WhatifPassthru".
What if: Performing operation "Output to File" on Target "inner WhatifPassthru".

** VERBOSE **
VERBOSE: Performing operation "ShouldProcess" on Target "outer verbose".
VERBOSE: Performing operation "ShouldProcess" on Target "inner VerbosePassthru".
What if: Performing operation "ShouldProcess" on Target "inner WhatifPassthru".
What if: Performing operation "Output to File" on Target "inner WhatifPassthru".

** WHATIF **
What if: Performing operation "ShouldProcess" on Target "outer whatif".
What if: Performing operation "Output to File" on Target "outer whatif".
What if: Performing operation "ShouldProcess" on Target "inner ImplicitPassthru".
What if: Performing operation "Output to File" on Target "inner ImplicitPassthru".
What if: Performing operation "ShouldProcess" on Target "inner VerbosePassthru".
What if: Performing operation "Output to File" on Target "inner VerbosePassthru".
What if: Performing operation "ShouldProcess" on Target "inner WhatifPassthru".
What if: Performing operation "Output to File" on Target "inner WhatifPassthru".

In meinen Augen gibt es hier mehrere Merkwürdigkeiten:

  • Die Angabe von -WhatIf:$foo bewirkt immer schalten Sie $WhatIf im Aufrufer (und seinen Aufrufen) ein, egal was $foo ist.
  • Wenn Sie -WhatIf "for real" angeben (ohne es auf eine vorhandene Variable zu beschränken), wird es implizit auf Aufrufe übertragen. Es besteht keine Notwendigkeit für Passthru oder Splatting.
  • Im Gegensatz zu -WhatIf führt die explizite Option -Verbose nicht zu impliziten Kaskaden von Aufrufen.
  • Wenn Sie versuchen, die Option -Verbose:$foo manuell zu übergehen, ist das Verhalten ähnlich wie bei -WhatIf:$foo. Es betrifft jedoch nur Skripte, die $psCmdlet.ShouldProcess() manuell testen - eingebaute Cmdlets sind davon nicht betroffen.

N.B.. : Confirm verhält sich identisch zu WhatIf. Ich habe es der Kürze halber weggelassen.

Bei der Suche im Web und in Connect sehe ich kaum eine eingehende Diskussion über das Verhalten von ShouldProcess (pro oder contra) in Bezug auf erweiterte Funktionen. Das Naheliegendste ist ein Beitrag von James O'Neill die die Übergabe einer einzigen Instanz von $psCmdlet im gesamten Aufrufstapel empfiehlt. Er tut dies jedoch, um ein ganz anderes Problem zu umgehen (Vermeidung von mehreren -Confirm-Aufforderungen). In der Zwischenzeit, wenn Sie mit dem Standard $psCmdlet zu jeder Funktion zur Verfügung gestellt bleiben, sehe ich keine Dokumente auf, was zu erwarten ... geschweige denn Design Patterns, Best Practices, etc...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X