Остановить наследование WhatIf в командлетах, которые не используют SupportsShouldProcess.

Каков правильный способ предотвратить наследование WhatIfPreference дочерней функцией?

Я написал несколько функций, для которых имеет смысл использовать параметр WhatIf, чтобы разрешить их запуск в безопасном/тестовом режиме. Однако эти функции вызывают другие командлеты (например, запись входа в файл), которые я хочу запустить независимо от параметра WhatIf. Я предполагал, что WhatIfPreference будет автоматически наследоваться командами, в которых реализован SupportsShouldProcess (так оно и есть), но любые команды, у которых нет этого атрибута, не будут знать о SupportsShouldProcess/WhatIfPreference, что разорвет цепочку.

Я мог бы сделать так, чтобы те командлеты, которые я хочу всегда запускать, вызывали любые командлеты, которые реализуют SupportsShouldProcess с -WhatIf:$False; но это означает размещение этого значения во многих местах и ​​кажется неправильным, учитывая, что контекст вызова не знает о SupportsShouldProcess.

Я мог бы реализовать SupportsShouldProcess во всех своих командлетах, а затем вызывать те, которые я хочу всегда запускать, с -WhatIf:$False из тех, где я действительно хочу использовать SupportsShouldProcess; но опять же глупо реализовывать что-то только для того, чтобы не использовать это.

Я уверен, что есть лучший вариант; но я пока не нашел.

Пример этого наследования:

Function Nest1 {
    [CmdletBinding(SupportsShouldProcess)]
    Param ()
    "Nest1 $WhatIfPreference"
    Nest2
}

Function Nest2 {
    [CmdletBinding()]
    Param ()
    "Nest2 $WhatIfPreference"
    Nest3
    Nest3 -WhatIf:$false
}

Function Nest3 {
    [CmdletBinding(SupportsShouldProcess)]
    Param ()
    "Nest3 $WhatIfPreference"
}

Вызов этих функций с параметром -WhatIf и без него приведет к следующему поведению:

Nest1
# Output:
#  Nest1 False
#  Nest2 False
#  Nest3 False
#  Nest3 False

Nest1 -WhatIf
# Output:
#  Nest1 True
#  Nest2 True
#  Nest3 True
#  Nest3 False

Я хотел бы получить что-то вроде этого:

Nest1 -WhatIf
# Output:
#  Nest1 True
#  Nest2 False     # as it doesn't implement SupportsShouldProcess
#  Nest3 False     # as its caller doesn't implement SupportsShouldProcess
#  Nest3 False     # multiple reasons (caller and -WhatIf:$False)

person JohnLBevan    schedule 10.04.2021    source источник
comment
$WhatIfPreference переменная присутствует всегда, по умолчанию имеет значение $false и (как и другие переменные) не изменяется самопроизвольно. (в заданном объеме). SupportsShouldProcess аргумент (или его отсутствие) не изменяет значение $WhatIfPreference  -  person JosefZ    schedule 11.04.2021
comment
С другой стороны, переменная $WhatIfPreference сохраняет свое значение в заданной области до тех пор, пока не будет изменена (безразлично, если она изменена явно либо с помощью оператора присваивания, либо с помощью -WhatIf в вызывающей программе, которая ее поддерживает)…   -  person JosefZ    schedule 11.04.2021
comment
Спасибо @JosefZ; это имеет смысл; Я просто надеялся, что, когда SupportsShouldProcess не будет реализовано, значение будет установлено обратно в false в пределах области действия этой функции (и, следовательно, по умолчанию в области любых дочерних процессов); или, по крайней мере, что будет способ легко вызвать такое поведение.   -  person JohnLBevan    schedule 11.04.2021


Ответы (1)


Мое текущее решение состоит в том, чтобы установить $WhatIfPreference = $false в качестве первой строки любых командлетов, которые не реализуют SupportsShouldProcess, чтобы они не передавали это значение никаким командлетам, которые они вызывают, даже если эти командлеты реализуют SupportsShouldProcess. Это кажется хакерским, но чище, чем другие варианты. К счастью, из-за переменных областей действия изменения этой переменной не влияют на вызывающую программу; поэтому в приведенном ниже примере оба выхода Nest1 показывают это значение как истинное, хотя второй результат после вызова Nest2.

Function Nest1 {
    [CmdletBinding(SupportsShouldProcess)]
    Param ()
    "Nest1 $WhatIfPreference"
    Nest2
    "Nest1 $WhatIfPreference"
}

Function Nest2 {
    [CmdletBinding()]
    Param ()
    $WhatIfPreference = $false
    "Nest2 $WhatIfPreference"
    Nest3
}

Function Nest3 {
    [CmdletBinding(SupportsShouldProcess)]
    Param ()
    "Nest3 $WhatIfPreference"
}
person JohnLBevan    schedule 11.04.2021