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
wyjściowa:
** 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".
Aby oka istnieje kilka osobliwości tutaj:
- Określanie -whatIf: $ foo zawsze kolej na $ whatIf w callee (i jego callees), bez względu na to, co jest $ foo.
- Po wybraniu opcji "Co prawda" na rzeczywistą "(bez ograniczania istniejącej zmiennej), propaguje do pośredników niejawnie. Nie ma potrzeby stosowania passthru lub splattingu.
- W przeciwieństwie do -WhatIf, explicite -Verbose nie kaskadowo przechodzi do pośredników.
- Przy próbie ręcznego podania hasła -Verbose: $ foo, widzisz zachowanie podobne do -WhatIf: $ foo. Ale wpływa tylko na skrypty, które testują ręcznie $ psCmdlet. Nie ma to wpływu na budowane w cmdletach polecenia `ShouldProcess().
N.B.: Potwierdzenie zachowuje się identycznie jak WhatIf. Pominąłem to dla zwięzłości.
Przeszukując internet i Connect, nie widzę prawie żadnej dogłębnej dyskusji na temat zachowania ShouldProcess (pro lub con) w odniesieniu do funkcji zaawansowanych. Najbliżej jest a post from James O'Neill, który zaleca przekazanie pojedynczej instancji $ psCmdlet przez cały stos wywołań. Robi to jednak, aby obejść zupełnie inny problem (unikając wielokrotnych monitów potwierdzających). Tymczasem, gdy pozostaniesz ze standardowym $ psCmdlet dostarczonym do każdej funkcji, nie widzę dokumentów na temat tego, czego się spodziewać ... znacznie mniej wzorów, najlepszych praktyk itp.
Bug złożony: https://connect.microsoft.com/PowerShell/feedback/details/535559/shouldprocess-cmdlets-the-verbose-preference-is-not-evaluated-in-callees Zmuszanie null - > True to również błąd IMO, ponieważ nie ma on normalnych parametrów przełącznika. Zapisano osobno @ https://connect.microsoft.com/PowerShell/feedback/details/535557/shouldprocess-synthetic-parameters-should-not-coerce-null-true –
Zagłosowano. Dziękuję za zgłoszenie. –
Dobra robota chłopaki. – JasonMArcher