Наборы параметров 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]Вы не можете получить доступ / проверить другие параметры, чтобы проверить их значения, и если вы установите их в условно обязательные значения (чтобы проверить наличие файла), он будет выполнять проверку только тогда, когда параметр привязан.

Это также похоже на запах кода? Любопытно о вашем случае использования.

Другие вопросы по тегам