Динамический параметр, обращающийся к значению по умолчанию

У меня есть функция 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
}
Другие вопросы по тегам