簡體   English   中英

根據開關強制參數 - PowerShell

[英]Make parameter mandatory based on switch - PowerShell

如果使用交換機或交換機組合,我需要強制執行一些參數,這種情況很困難。 以下是我想要做的例子:

[CmdletBinding(DefaultParameterSetName='DefaultConfiguration')]
Param
(        
[Parameter(Mandatory=$true)][String]$Location,
[Parameter(Mandatory=$true)][String]$DPMServername,

[Parameter(Mandatory=$False, ParameterSetName='CustomConfiguration')]
[Switch]$CustomizeDPMSubscriptionSettings,
[Parameter(Mandatory=$True, ParameterSetName='CustomConfiguration')]
[String]$StagingAreaPath,

[Parameter(Mandatory=$False, ParameterSetName='EncryptionSettings')]
[Parameter(ParameterSetName='CustomConfiguration')]
[Switch]$SetEncryption,
[Parameter(Mandatory=$true, ParameterSetName='EncryptionSettings')]
[Parameter(Mandatory=$False, ParameterSetName='CustomConfiguration')]
[String]$EncryptionPassPhrase,

[Parameter(Mandatory=$False, ParameterSetName='ProxyEnabled')]
[Parameter(ParameterSetName='CustomConfiguration')]
[Switch]$SetProxy,
[Parameter(Mandatory=$true, ParameterSetName='ProxyEnabled')]
[Parameter(ParameterSetName='CustomConfiguration')]
[String]$ProxyServerAddress,
[Parameter(Mandatory=$true, ParameterSetName='ProxyEnabled')]
[Parameter(Mandatory=$False, ParameterSetName='CustomConfiguration')]
[String]$ProxyServerPort
)

在這里,我需要遵循以下條件:

  1. 如果使用-CustomizeDPMSubscriptionSettings(Switch)參數,則必須要求Staging AreaPath ----這樣工作正常
  2. 只有當-CustomizeDPMSubscriptionSettings(Switch)參數與-SetEncryption一起使用時,它必須要求-EncryptionPassPhrase
  3. 只有當-CustomizeDPMSubscriptionSettings(Switch)參數與-SetProxy一起使用時,它必須要求-ProxyServerAddress和-ProxyServerPort

很抱歉,如果這聽起來像是一個重復的問題,但我在這里發現的其他帖子並沒有幫助我解決我的問題 我很困惑 :-(

注意:上面的代碼是我嘗試使用不同組合的一部分。 請根據需要更正。

這是一個似乎做你期望解決方案。
我所做的是為每個可能的組合創建一個參數集。
- CustomConfiguration
- EncryptionSettings
- ProxyEnabled
- EncryptionAndProxy


一個限制是除非使用EncryptionAndProxy ,否則它不會提示特定的缺失參數,而是會聲明它無法解析參數集。

[CmdletBinding(DefaultParameterSetName='DefaultConfiguration')]
Param
(        
[Parameter(Mandatory=$true)][String]$Location,
[Parameter(Mandatory=$true)][String]$DPMServername,

[Parameter(Mandatory=$True, ParameterSetName='CustomConfiguration')]
[Parameter(Mandatory=$True, ParameterSetName='EncryptionSettings')]
[Parameter(Mandatory=$True, ParameterSetName='ProxyEnabled')]
[Parameter(Mandatory=$True, ParameterSetName='EncryptionAndProxy')]
[Switch]$CustomizeDPMSubscriptionSettings,

[Parameter(Mandatory=$True, ParameterSetName='CustomConfiguration')]
[Parameter(Mandatory=$True, ParameterSetName='EncryptionSettings')]
[Parameter(Mandatory=$True, ParameterSetName='ProxyEnabled')]
[Parameter(Mandatory=$True, ParameterSetName='EncryptionAndProxy')]
[String]$StagingAreaPath,

[Parameter(Mandatory=$True, ParameterSetName='EncryptionSettings')]
[Parameter(Mandatory=$True, ParameterSetName='EncryptionAndProxy')]
[Switch]$SetEncryption,

[Parameter(Mandatory=$true, ParameterSetName='EncryptionSettings')]
[Parameter(Mandatory=$True, ParameterSetName='EncryptionAndProxy')]
[String]$EncryptionPassPhrase,

[Parameter(Mandatory=$True, ParameterSetName='ProxyEnabled')]
[Parameter(Mandatory=$True, ParameterSetName='EncryptionAndProxy')]
[Switch]$SetProxy,

[Parameter(Mandatory=$true, ParameterSetName='ProxyEnabled')]
[Parameter(Mandatory=$True, ParameterSetName='EncryptionAndProxy')]
[String]$ProxyServerAddress,

[Parameter(Mandatory=$true, ParameterSetName='ProxyEnabled')]
[Parameter(Mandatory=$True, ParameterSetName='EncryptionAndProxy')]
[String]$ProxyServerPort
)

我正在研究基於動態參數的第二種潛在解決方案。

編輯:正如所承諾的,這是一個基於動態參數的解決方案

[CmdletBinding(DefaultParameterSetName='DefaultConfiguration')]
Param
(        
    [Parameter(Mandatory=$true)][String]$Location,
    [Parameter(Mandatory=$true)][String]$DPMServername,

    [Switch]$CustomizeDPMSubscriptionSettings,
    [Switch]$SetEncryption,
    [Switch]$SetProxy
)

DynamicParam
{
    $paramDictionary = New-Object -Type System.Management.Automation.RuntimeDefinedParameterDictionary
    $attributes = New-Object System.Management.Automation.ParameterAttribute
    $attributes.ParameterSetName = "__AllParameterSets"
    $attributes.Mandatory = $true
    $attributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute]
    $attributeCollection.Add($attributes)
    # If "-SetEncryption" is used, then add the "EncryptionPassPhrase" parameter
    if($SetEncryption)
    { 
        $dynParam1 = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("EncryptionPassPhrase", [String], $attributeCollection)   
        $paramDictionary.Add("EncryptionPassPhrase", $dynParam1)
    }
    # If "-SetProxy" is used, then add the "ProxyServerAddress" "ProxyServerPort" and parameters
    if($SetProxy)
    {
        $dynParam1 = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("ProxyServerAddress", [String], $attributeCollection)   
        $paramDictionary.Add("ProxyServerAddress", $dynParam1)
        $dynParam2 = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("ProxyServerPort", [String], $attributeCollection)   
        $paramDictionary.Add("ProxyServerPort", $dynParam2)
    }
    # If "-CustomizeDPMSubscriptionSettings" is used, then add the "StagingAreaPath" parameter
    if($CustomizeDPMSubscriptionSettings)
    {
        $dynParam1 = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("StagingAreaPath", [String], $attributeCollection)   
        $paramDictionary.Add("StagingAreaPath", $dynParam1)
    }
    return $paramDictionary
}
Process{
    foreach($key in $PSBoundParameters.keys)
    {
        Set-Variable -Name $key -Value $PSBoundParameters."$key" -Scope 0
    }
}

這個功能是根據每個開關的存在動態地為您的功能添加參數。
這支持自動完成,並且更好地支持缺少的參數。 如果使用相應的開關,它將明確詢問缺少的參數。
第二次編輯:我添加了這個構造必需的Process部分,以及變量創建位,這使事情變得更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM