PowerShell参数集或动态参数

时间:2019-02-06 03:39:49

标签: powershell dynamicparameters parameter-sets

我正在尝试找出哪种方法最适合以下情况。

示例功能

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 个答案:

答案 0 :(得分:0)

动态参数是严格处理想要执行的操作的严格方法,但是在大多数情况下,我认为它们不值得付出努力。

处理此问题的最直接方法是不要强制使用字符串参数,而只需在函数开头进行检查即可。

您有一个process块,但示例参数未采用管道输入。如果函数正在接受管道输入,请考虑将检查放在哪里;否则,请执行以下步骤。可能在开始块中,但这可能取决于参数吗?

我也正在为此而滥用[ValidateScript({})],但是它并不能完全起作用,因为如果将其添加到[switch]上,则无法访问/检查其他参数来检查它们的值,如果将其放在有条件的强制值上(以检查文件是否存在),则仅在绑定参数时才运行验证。

这也有点像代码气味吗?对您的用例感到好奇。