Каков правильный способ предотвратить наследование 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)
$WhatIfPreference
переменная присутствует всегда, по умолчанию имеет значение$false
и (как и другие переменные) не изменяется самопроизвольно. (в заданном объеме).SupportsShouldProcess
аргумент (или его отсутствие) не изменяет значение$WhatIfPreference
… - person JosefZ   schedule 11.04.2021$WhatIfPreference
сохраняет свое значение в заданной области до тех пор, пока не будет изменена (безразлично, если она изменена явно либо с помощью оператора присваивания, либо с помощью-WhatIf
в вызывающей программе, которая ее поддерживает)… - person JosefZ   schedule 11.04.2021SupportsShouldProcess
не будет реализовано, значение будет установлено обратно в false в пределах области действия этой функции (и, следовательно, по умолчанию в области любых дочерних процессов); или, по крайней мере, что будет способ легко вызвать такое поведение. - person JohnLBevan   schedule 11.04.2021