无法根据特定值进行评估

Unable to evaluate against a specific value

我在思考如何处理这件事的正确逻辑时遇到了困难。我有一个接受两种类型开关的函数:

Function Test-Bool {
        
    Param (
        # Input Parameters
        [Parameter(Mandatory = $false,
                   HelpMessage='Enter. Workflow. Name.')]
        [Alias('OMB','MailBox')]
        [string]$Workflow,

        [Parameter(Mandatory = $false)]
        [Alias('EDIPI','DisplayName')]
        [string[]]$UserName

    )

      DynamicParam {
        if ($Workflow -ne $null -and $UserName -ne $null) {
          $parameterAttribute = [System.Management.Automation.ParameterAttribute]@{
              ParameterSetName = "AddingMembers"
              Mandatory = $false
          }

          $attributeCollection = [System.Collections.ObjectModel.Collection[System.Attribute]]::new()
          $attributeCollection.Add($parameterAttribute)

          $dynParam1 = [System.Management.Automation.RuntimeDefinedParameter]::new(
            'Add', [switch], $attributeCollection
          )

          $paramDictionary = [System.Management.Automation.RuntimeDefinedParameterDictionary]::new()
          $paramDictionary.Add('Add', $dynParam1)
          

          $parameterAttribute1 = [System.Management.Automation.ParameterAttribute]@{
              ParameterSetName = "RemovingMembers"
              Mandatory = $false
          }

          $attributeCollection1 = [System.Collections.ObjectModel.Collection[System.Attribute]]::new()
          $attributeCollection1.Add($parameterAttribute1)

          $dynParam11 = [System.Management.Automation.RuntimeDefinedParameter]::new(
            'Remove', [switch], $attributeCollection1
          )

          $paramDictionary.Add('Remove', $dynParam11)
          return $paramDictionary

        }
      }      
    Begin {
        $ABool = {
            'Add Block'
            $Bool = Read-Host -Prompt 'Adding or Removing Member(s)'
                if ($Bool.ToLower() -like 'a*') {
                    $true
                }
                else {
                    Break;
                }
        }
        $RBool = {
            'Remove Block'
            $Bool = Read-Host -Prompt 'Adding or Removing Member(s)'
                if ($Bool.ToLower() -like 'r*') {
                    $true
                }
                else {
                    Break;
                }
        }   
        if ($PSBoundParameters['Add'].IsPresent) { [bool]$Add = $true }
        elseif ($PSBoundParameters['Remove'].IsPresent) { [bool]$Remove = $true }
        elseif (-not$PSBoundParameters['Add'].IsPresent) { $Add = & $ABool }
        elseif (-not$PSBoundParameters['Remove'].IsPresent) { $Remove = & $RBool }
    }
    Process {
        if ($Add) {       
            "Add was selected"
        }
        if ($Remove) {
            "Remove was selected"
        }
    }
}

我可以 运行 有几种方法:

这是有道理的,因为首先评估 elseif (-not$PSBoundParameters['Add'].IsPresent) { $Add = & $ABool },当被询问时,输入 Remove 并将其扔到 else 块中,使其成为 Break/Exit.


问题: 当键入 Add 时,我可以更改什么以使 $Remove 被评估为真,反之亦然( 使 $Add 为真)?

老实说,我把自己弄糊涂了,所以我决定在这里 post 而不是试图自己解决这个问题。

改用Parameter Sets

Function Test-Bool {
    [CmdletBinding(DefaultParameterSetName = 'Undecided')]
    Param (
        # Input Parameters
        [Parameter(Mandatory = $false,
                   HelpMessage='Enter. Workflow. Name.')]
        [Alias('OMB','MailBox')]
        [string]$Workflow,

        [Parameter(Mandatory = $false)]
        [Alias('EDIPI','DisplayName')]
        [string[]]$UserName,

        [Parameter(Mandatory = $true, ParameterSetName = 'Add')]
        [switch]$Add,

        [Parameter(Mandatory = $true, ParameterSetName = 'Remove')]
        [switch]$Remove
    )

    begin {
        $action = if($PSCmdlet.ParameterSetName -eq 'Undecided'){
            $answer = Read-Host -Prompt 'Adding or Removing Member(s)?'
            if($answer -like 'a*'){
                'Add'
            }
            elseif($answer -like 'r*') {
                'Remove'
            }
            else {
                throw 'Invalid option provided'
            }
        }
        else {
            $PSCmdlet.ParameterSetName
        }

        # $action now contains either 'Add' or 'Remove'
        $actionBlock = @{
            'Add'    = { <# code to add user to workflow #> }
            'Remove' = { <# code to remove user from workflow #> }
        }[$action]
    }

    process {
        # if/else statements no longer needed, $actionBlock contains the correct scriptblock
        . $actionBlock
    }

}

如果用户未指定任一开关,则参数集名称将为 Undecided,并且将在开始块中提示用户 - 否则我们仅使用与指定的参数集关联的参数集名称切换。

由于两个开关参数属于不同的参数集,用户不能再同时选择两者。