如何使PowerShell动态参数更具动态性?

How to make PowerShell Dynamic parameters more dynamic?

提问人:SpyNet 提问时间:10/3/2023 最后编辑:SpyNet 更新时间:10/3/2023 访问量:38

问:

这是我的代码

function test-function {
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory = $false, ParameterSetName = 'parameter set A')][switch]$Default,
        [Parameter(Mandatory = $false, ParameterSetName = 'parameter set B')][switch]$NoFlightRoots,

        # [Parameter(Mandatory = $false, ParameterSetName = 'parameter set A')]
        # [Parameter(Mandatory = $false, ParameterSetName = 'parameter set B')]
        # [switch]$PrepMode,

        # [Parameter(Mandatory = $false, ParameterSetName = 'parameter set A')]
        # [Parameter(Mandatory = $false, ParameterSetName = 'parameter set B')]
        # [switch]$AuditAndEnforce,

        [Parameter(Mandatory = $false, ParameterSetName = 'parameter set A')]
        [Parameter(Mandatory = $false, ParameterSetName = 'parameter set B')]
        [Switch]$SomeMoreParameter,

        [Parameter(Mandatory = $false, ParameterSetName = 'parameter set A')]
        [Parameter(Mandatory = $false, ParameterSetName = 'parameter set B')]
        [Switch]$SomeMoreParameter2
    )

    DynamicParam {
        if (
($PSBoundParameters['Default']) -or ($PSBoundParameters['NoFlightRoots'])
        ) {
           
            # Add the dynamic parameters to the param dictionary
            $paramDictionary = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()

            if (!$PSBoundParameters['PrepMode']) {

                # Create a dynamic parameter for AuditAndEnforce
                $AuditAndEnforceDynamicParameter = [System.Management.Automation.ParameterAttribute]@{
                    Mandatory        = $false
                    ParameterSetName = '__AllParameterSets'
                    HelpMessage      = 'The mode to audit and enforce the policy.'
                }
            
                $paramDictionary.Add('AuditAndEnforce', [System.Management.Automation.RuntimeDefinedParameter]::new(
                        'AuditAndEnforce',
                        [switch],
                        [System.Management.Automation.ParameterAttribute[]]@($AuditAndEnforceDynamicParameter)
                    ))
            }           

            if (!$PSBoundParameters['AuditAndEnforce']) {

                # Create a dynamic parameter for PrepMode
                $PrepModeDynamicParameter = [System.Management.Automation.ParameterAttribute]@{
                    Mandatory        = $false
                    ParameterSetName = '__AllParameterSets'
                    HelpMessage      = 'The name of the computer to sign the policy for.'
                }

                $paramDictionary.Add('PrepMode', [System.Management.Automation.RuntimeDefinedParameter]::new(
                        'PrepMode',
                        [switch],
                        [System.Management.Automation.ParameterAttribute[]]@($PrepModeDynamicParameter)
                    ))
            }
           
            return $paramDictionary
        }
    }

    begin {}

    process {} 
}
test-function -Default

目标是使 和 参数互斥而不显示任何错误。这完全与控制台上的 PowerShell 参数建议有关。-PrepMode-AuditAndEnforce

我尝试了不同的方法,这是我迄今为止最接近的方法。代码有问题,我需要一种方法来强制动态参数块更加动态,即我需要它多次重新评估所选参数。

当我这样做时

test-function -Default -PrepMode

我不想接下来被建议,反之亦然。-AuditAndEnforce

我使用 PowerShell 7.3。

我现在可以同时选择这两个参数的原因是,Dynamic parameter 模块只对所选参数进行一次评估,并且由于它看到这两个参数中没有一个被选中,因此它同时提供了这两个参数,但是当我选择其中一个动态参数时,我需要该模块再次运行,以根据所选的动态参数更新其逻辑。

PowerShell 条件语句 可选 powershell-7.3 动态参数

评论


答: 暂无答案