Динамический параметр, обращающийся к значению по умолчанию
У меня есть функция PowerShell, которая принимает необязательный параметр, проверенный с помощью ValidateSetAttribute
и на основе этого значения добавляет еще один динамический параметр. Однако в строгом режиме при попытке доступа к параметру внутри DynamicParam
блок, и я не установил явно указанный параметр, тогда я получаю ошибку, что переменная не была определена.
Param(
[Parameter()]
[ValidateSet('A', 'B')]
[string] $Target = 'A'
)
DynamicParam {
if ($Target -eq 'B') { # <- Here it fails
# Add new parameter here...
}
}
end {
Write-Host $Target
}
Скрипт работает при вызове с A
или же B
в качестве первого параметра, но завершается неудачно, если параметр не указан. Интересно, если я удалю либо ParameterAttribute
или ValidateSetAttribute
из определения параметра это работает.
Мой текущий обходной путь - получить доступ к переменной с помощью $PSBoundParameters
и проверьте, был ли установлен параметр, например так:
if ($PSBoundParameters.ContainsKey('Target') -and $PSBoundParameters.Target -eq 'B') {
# Add new parameter here...
}
Хотя это работает нормально, у него есть один недостаток, если я хочу проверить значение A
вместо: как A
значение по умолчанию для параметра, к которому он не будет добавлен $PSBoundParameters
когда параметр опущен и применяется значение по умолчанию. Поэтому мне нужно изменить мой чек, чтобы точно проверить, что:
if (-not $PSBoundParameters.ContainsKey('Target') -or $PSBoundParameters.Target -eq 'A')) {
# Add new parameter here...
}
Мне не очень нравится это решение, так как оно излишне связывает динамическое добавление параметров со значениями по умолчанию. В идеале я хотел бы иметь возможность изменить значение по умолчанию, не касаясь ничего другого. Есть ли способ получить доступ к фактическому значению параметра из DynamicParam
блок? Или есть хотя бы возможность получить доступ к определению параметра и получить доступ к значению по умолчанию?
1 ответ
Если вам нужно правильно запустить в случае PSDebug
работает в strict
Режим (set-psdebug -strict
), вы можете сделать что-то вроде этого:
Param(
[Parameter()]
[ValidateSet('A', 'B')]
[string] $Target = 'A'
)
DynamicParam {
# Ensure $Target is defined
try { [void]$Target }
catch { $Target = [string]::Empty }
if ($Target -eq 'B') {
write-host "si si"
}
}
end {
Write-Host $Target
}