我正在尝试找出哪种方法最适合以下情况。
示例功能
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
。我发现将其他所有内容都配置为动态参数是错误的。
答案 0 :(得分:0)
动态参数是严格处理想要执行的操作的严格方法,但是在大多数情况下,我认为它们不值得付出努力。
处理此问题的最直接方法是不要强制使用字符串参数,而只需在函数开头进行检查即可。
您有一个process
块,但示例参数未采用管道输入。如果函数正在接受管道输入,请考虑将检查放在哪里;否则,请执行以下步骤。可能在开始块中,但这可能取决于参数吗?
我也正在为此而滥用[ValidateScript({})]
,但是它并不能完全起作用,因为如果将其添加到[switch]
上,则无法访问/检查其他参数来检查它们的值,如果将其放在有条件的强制值上(以检查文件是否存在),则仅在绑定参数时才运行验证。
这也有点像代码气味吗?对您的用例感到好奇。