Наборы параметров PowerShell или динамические параметры
Я пытаюсь выяснить, какой метод будет лучше всего работать в следующей ситуации.
Пример функции:
Set-APICredentials {
[CmdletBinding()]
param(
[Parameter(Mandatory)]
[string]$APIUser,
[Parameter(Mandatory)]
[string]$APIKey,
[Parameter(Mandatory)]
[string]$PFXFile,
[Parameter(Mandatory)]
[string]$PFXPassword,
[switch]$AsVariable
)
begin{
$PFXPath = (Get-ChildItem -Name $PFXFile).FullName
}
process{
#create basic auth header from APIUser and APIKey
$basicAuthHeader
#create certificate object, verify private key, convert back into PFX Collection as bytes string variable
$clientAuthCertRaw
#create hashtable with credentials
$credentials = @{
basicAuthHeader = $basicAuthHeader
clienAuthCertRaw = $clientAuthCertRaw
}
}
end{
if ($AsVariable) {
Sglobal:APICreds = $credentials
} else {
Export-Clixml -InputObject $credentials -Path $PSScriptRoot\APICredentials.xml
}
}
}
Если (Test-Path -Path $PSScriptRoot\APICredentials.xml)
это правда и -AsVariable
указывается, тогда никакие другие параметры не нужны / не используются.
В противном случае, если (Test-Path -Path $PSScriptRoot\APICredentials.xml)
ложно, тогда требуется все, что ранее было указано как обязательное.
Есть ли способ создать условный набор параметров?
Должен ли я просто создать два набора параметров и выдать ошибку, если ранее заявленная логика неверна? Или я должен установить -AsVariable
в качестве параметра и обрабатывать остальное с динамическими параметрами?
Потому что в большинстве случаев все является обязательным, и это только при особых обстоятельствах, которые -AsVariable
используется сам по себе. Я полагал, что настройка всего остального в качестве динамических параметров будет неправильной.
1 ответ
Динамические параметры - это строгий способ обработки именно того, что вы хотите сделать, но я не думаю, что в большинстве случаев они стоят усилий.
Самый простой способ справиться с этим - не включать обязательные строковые параметры, а просто выполнить проверку в начале функции.
У тебя есть process
блок, но примеры параметров не принимают конвейерный ввод. Если функция принимает входные данные конвейера, подумайте, куда вы помещаете эту проверку; возможно в начале блока, но это будет зависеть от параметров возможно?
Я также играл со злоупотреблениями [ValidateScript({})]
для этого, но это не совсем сработает, потому что если вы добавите его на [switch]
Вы не можете получить доступ / проверить другие параметры, чтобы проверить их значения, и если вы установите их в условно обязательные значения (чтобы проверить наличие файла), он будет выполнять проверку только тогда, когда параметр привязан.
Это также похоже на запах кода? Любопытно о вашем случае использования.