PowerShell参数集或动态参数

PowerShell参数集或动态参数,powershell,dynamicparameters,parameter-sets,Powershell,Dynamicparameters,Parameter Sets,我试图找出哪种方法最适合以下情况 示例函数: Set-APICredentials { [CmdletBinding()] param( [Parameter(Mandatory)] [string]$APIUser, [Parameter(Mandatory)] [string]$APIKey, [Parameter(Mandatory)] [string]$PFXFile,

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

示例函数:

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
        }
    }
}
如果
(测试路径-Path$PSScriptRoot\APICredentials.xml)
为真,并且指定了
-AsVariable
,则不需要/使用其他参数

否则,如果
(测试路径-Path$PSScriptRoot\APICredentials.xml)
为false,则之前声明为必需的所有内容都是必需的

有没有办法创建条件参数集

我是否应该创建两个参数集,并在前面说明的逻辑为false时出错?或者我应该将
-AsVariable
设置为一个参数,并使用动态参数处理其余参数


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

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

处理这个问题最简单的方法是不强制使用字符串参数,只在函数的开头进行检查

您有一个
进程
块,但示例参数不接受管道输入。如果函数正在接受流水线输入,则考虑将该检查放在何处;可能在begin块中,但可能取决于参数

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


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

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

处理这个问题最简单的方法是不强制使用字符串参数,只在函数的开头进行检查

您有一个
进程
块,但示例参数不接受管道输入。如果函数正在接受流水线输入,则考虑将该检查放在何处;可能在begin块中,但可能取决于参数

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


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

我通常会使用begin块进行检查,是的。在本例中,我只是停止编写示例。不知道你说的代码气味是什么意思?用例中的4个参数实际上是APIUser、APIKey、PFXFile、PFXPassword。所有这些都将使用Clixml加载和保存,以便在RESTAPI包装模块中使用。目标是添加-AsVariable来选择性地保存当前ishell/传递到psremote会话的凭据,而不是总是从文件中提取和保存。我喜欢PowerShell的内置提示,比如缺少参数,并希望找出此场景的正确用例。我通常会使用begin块进行检查,是的。在本例中,我只是停止编写示例。不知道你说的代码气味是什么意思?用例中的4个参数实际上是APIUser、APIKey、PFXFile、PFXPassword。所有这些都将使用Clixml加载和保存,以便在RESTAPI包装模块中使用。目标是添加-AsVariable来选择性地保存当前ishell/传递到psremote会话的凭据,而不是总是从文件中提取和保存。我喜欢PowerShell的内置提示,比如缺少参数,并希望找出此场景的正确用例。示例中的流程块主要是伪代码,而不是实际函数。-AsVariable的目标是允许将凭据临时存储到全局变量范围,以便与模块中的其他函数一起使用,而不是存储到文件中。这也使得远程pssessions更容易使用。示例中的进程块主要是伪代码,而不是实际函数。-AsVariable的目标是允许将凭据临时存储到全局变量范围,以便与模块中的其他函数一起使用,而不是存储到文件中。这也使得远程pssessions更容易使用。