Наборы параметров PowerShell или динамические параметры - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь выяснить, какой метод лучше всего подойдет для следующей ситуации.

Пример функции:

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) имеет значение true и указано -AsVariableтогда никакие другие параметры не нужны / не используются.

В противном случае, если (Test-Path -Path $PSScriptRoot\APICredentials.xml) имеет значение false, то требуется все ранее указанное как обязательное.

Существует ли какой-либо способ создания набора условных параметров?

Должен ли я просто создать два набора параметров и выдать ошибку, если ранее заявленная логика неверна?Или я должен установить -AsVariable в качестве параметра и обработать все остальное динамическими параметрами?

Поскольку в большинстве случаев все является обязательным и только в особых случаях использование -AsVariable само по себе.Я полагал, что настройка всего остального в качестве динамических параметров будет неправильной.

1 Ответ

0 голосов
/ 06 февраля 2019

Динамические параметры - это строгий способ обработки именно того, что вы хотите сделать, но я не думаю, что в большинстве случаев они стоят усилий.

Самый простой способ справиться с этим - не обязательно указывать строковые параметры, а просто выполнить проверку в начале функции.

У вас есть блок process, но примеры параметров не принимают конвейерный ввод.Если функция принимает входные данные конвейера, подумайте, куда вы помещаете эту проверку;возможно, в начале блока, но это будет зависеть от параметров, может быть?

Я также играл с злоупотреблением [ValidateScript({})] для этого, но это не совсем сработает, потому что, если вы добавите его на [switch], вы не можете получить доступ / проверить другие параметры, чтобы проверить их значения, и если вы поместите его в условно обязательные значения (чтобы проверить наличие файла), он будет запускать проверку только тогда, когда параметр привязан.

Это также похоже на запах кода?Интересует ваш вариант использования.

...