1

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

示例函数:

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)为 false,则需要之前声明为强制的所有内容。

有什么方法可以创建条件参数集吗?

如果前面陈述的逻辑是错误的,我应该只创建两个参数集并出错吗?或者我应该设置-AsVariable为参数并使用动态参数处理其余部分?

因为在大多数情况下,一切都是强制性的,并且只有在特殊情况下才能单独-AsVariable使用。我认为将其他所有内容配置为动态参数是错误的。

4

1 回答 1

0

动态参数是准确处理您想要做的事情的严格方法,但我认为在大多数情况下它们不值得付出努力。

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

您有一个process块,但示例参数不接受管道输入。如果该函数正在接受管道输入,请考虑将该检查放在哪里;可能在开始块中,但它可能取决于参数?

我也在玩弄滥用[ValidateScript({})]这个,但它不太会起作用,因为如果你将它添加到[switch],你不能访问/检查其他参数来检查它们的值,如果你把它放在有条件的强制值(检查文件是否存在)它只会在绑定参数时运行验证。

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

于 2019-02-06T04:29:35.400 回答