How to process multiple ValidationSet parameter attribute values efficiently?

This topic contains 5 replies, has 2 voices, and was last updated by Profile photo of I Am Sir Ask Alot I Am Sir Ask Alot 2 years, 2 months ago.

  • Author
    Posts
  • #18931
    Profile photo of I Am Sir Ask Alot
    I Am Sir Ask Alot
    Participant

    I have an advanced function I have been working on that looks something like this:

    {Function Do-Something
    {
    [cmdletbinding()] 
         
        Param  
        (              
             [Parameter(Mandatory=$true, 
             [ValidateSet('Yes', 'No', 'Y', 'N', IgnoreCase = $true)]   
             [string[]]$Param1,
             
             [Parameter(Mandatory=$true,  
             [ValidateSet('Yes', 'No', 'Y', 'N', IgnoreCase = $true)] 
             [string[]]$Param2,
    
             [Parameter(Mandatory=$true,   
             [ValidateSet('Yes', 'No', 'Y', 'N', IgnoreCase = $true)] 
             [string[]]$Param3
        )  
    
     Begin {}
    
     Process 
     {
       
    
    
     }
    }}

    My question is, how do I get the values such as "Yes", "Y", "No", and "N" that's located in the [ValidateSet()] validation attribute processed correctly without having to use multiple "If" and "ElseIf" statements.

    For instance, I want to avoid the following, because I know there is a faster and more efficient way (less typing) to do it:

    If ($param1 -match "Yes" -or "Y" -and $param2 -match "Yes" -or "Y" -and $param3 -match "Yes" -or "Y")

    {

    #Do something here

    }

    ElseIf ($param1 -match "No" -or "N" -and $param2 -match "Yes" -or "Y" -and $param3 -match "Yes" -or "Y")

    {

    #Do something

    }

    I was reading that splatting may help me here, but I am new to the splatting technique and need some help with this one.

    I appreciate any help that anyone can offer.

    Thanks

  • #18932
    Profile photo of Dave Wyatt
    Dave Wyatt
    Moderator

    Well, in this specific case, I'd probably just look at the first letter of each parameter, since you know that they can only be Y/Yes or N/No. That would cut down on half of your conditions:

    if ($Param1 -like 'Y*' -and $Param2 -like 'Y*' -and $Param3 -like 'Y*')
    {
        # do something
    }
    

    The fact that you're defining these parameters as arrays throws a wrench in the works, though... then these conditions are really saying "if any of the elements in the array are Y or Yes for all three arrays, do something."

    Personally, I would just use switch parameters here, or at the least, booleans. Those already do a good job of indicating "yes/no" style values (true/false):

    function Do-Something
    {
        [CmdletBinding()]
        Param
        (
            [switch] $Param1,
            [switch] $Param2,
            [switch] $Param3
        )
    
        if ($Param1 -and $Param2 -and $Param3)
        {
            # Do Something
        }
    }
    
  • #18933
    Profile photo of I Am Sir Ask Alot
    I Am Sir Ask Alot
    Participant

    Ahh the switch parameter, of course. I've used them before on several occasions a while back. Had a brain fart there man.

    Thanks

  • #18934
    Profile photo of I Am Sir Ask Alot
    I Am Sir Ask Alot
    Participant

    To use the switch parameter, would I remove the "Mandatory=$true" attribute?

  • #18937
    Profile photo of Dave Wyatt
    Dave Wyatt
    Moderator

    Yes. Mandatory switches don't make much sense. 🙂

  • #18953
    Profile photo of I Am Sir Ask Alot
    I Am Sir Ask Alot
    Participant

    Of course they don't, just wanted confirmation.

    Thanks man

You must be logged in to reply to this topic.