Сценарии Powershell: рекомендуемый способ реализации ShouldProcess при вложенных вызовах функций?

Тестовый скрипт:

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 не касается неявно вызываемых абонентов.Когда вы пытаетесь вручную вставить -Verbose: $ foo, вы видите, что поведение похоже на -WhatIf: $ foo. Но это влияет только на сценарии, которые вручную тестируют $ psCmdlet.ShouldProcess () - встроенные командлеты не затрагиваются.

Нотабене: Подтверждение ведет себя идентично WhatIf. Я опустил это для краткости.

Выполняя поиск в Интернете и Connect, я почти не вижу подробного обсуждения поведения ShouldProcess (pro или con), касающегося расширенных функций. Ближайшая вещьсообщение от Джеймса О'Нила который рекомендует передавать один экземпляр $ psCmdlet по всему стеку вызовов. Тем не менее, он делает это, чтобы обойти совершенно другую проблему (избегая многократных запросов подтверждения). Между тем, когда вы придерживаетесь стандартного $ psCmdlet, предоставляемого для каждой функции, я не вижу документов о том, чего ожидать ... гораздо меньше шаблонов проектирования, лучших практик и т. Д.

Ответы на вопрос(2)

Ваш ответ на вопрос