Тест script:
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
Вывод:
** 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".
На мой взгляд, здесь есть несколько странностей:
- Задание -WhatIf: $foo будет всегда включать $WhatIf в вызываемый (и его вызываемые), независимо от того, что такое $foo.
- Когда вы указываете -WhatIf "для реального" (без ограничения его на существующую переменную), он распространяется на неявные вызовы. Нет необходимости в passthru или splatting.
- В отличие от -WhatIf, явный -Verbose не каскадирует, чтобы вызвать неявно.
- Когда вы пытаетесь вручную passthru -Verbose: $foo, вы видите, что поведение похоже на -WhatIf: $foo. Но это влияет только на скрипты, которые вручную проверяют $psCmdlet.ShouldProcess() - встроенные командлеты не затрагиваются.
N.B.: подтверждение ведет себя точно так же, как WhatIf. Я пропустил его для краткости.
Поиск в Интернете и Connect, я почти не вижу подробного обсуждения поведения IfProcess (pro или con), относящегося к расширенным функциям. Ближе всего сообщение от Джеймса О'Нила, в котором рекомендуется передать один экземпляр $psCdlet в стек вызовов. Тем не менее, он делает это, чтобы решить совершенно другую проблему (избегая нескольких запросов -Confirm). Между тем, когда вы придерживаетесь стандартного $psCmdlet, предоставляемого каждой функции, я не вижу документов о том, чего ожидать... гораздо меньше шаблонов проектирования, лучших практик и т.д.