I don't understand this behavior

Welcome Forums General PowerShell Q&A I don't understand this behavior

This topic contains 4 replies, has 3 voices, and was last updated by

 
Participant
4 years, 3 months ago.

  • Author
    Posts
  • #16569

    Participant
    Points: 0
    Rank: Member

    In a module, I have the following function snippet:

    function Get-InstalledSoftware {
    	
    	[CmdletBinding()]
    	param (
    		[string[]]$Name,
    		[string[]]$Publisher,
    		[string[]]$Computername = 'localhost'
    	)
    	begin {
    		Write-Verbose "Initiating the $($MyInvocation.MyCommand.Name) function...";
    		if ($Name) {
    			## Allow asterisks in cmdlet but WQL requires percentage
    			$Operator = @{ $true = 'LIKE'; $false = '=' }[$Name -match '\*']
    			$Name = $Name | foreach { $_.Replace('*', '%') }
    			$WhereQuery += "(ARPDisplayName $Operator '$($Name -join "' OR ARPDisplayName $Operator '")') "
    		}
    		
    	}
    }

    I am passing the strings 'name*' and 'name' to the $Name param and $Operator is always null. I can recreate this in the console and it works as expected. If $Name has a * in it, $Operator is LIKE. If $name doesn't have a * in it, $Operator is =.

    Can anyone shed some light on this?

  • #16572

    Participant
    Points: 0
    Rank: Member

    It looks like it has to do with your $Name parameter being a string array, while in the assignment of the $Operator variable it's being treated as a string. If I change the param block to [string]$Name I get the correct result.

    I'm guessing when you tested it in the console, you tried $Name = 'name' and not [string[]]$Name = 'name'.

  • #16576

    Participant
    Points: 0
    Rank: Member

    Yep, that was it. Thanks! Amazing how a couple of characters can screw you up. 🙂

  • #16585

    Participant
    Points: 0
    Rank: Member
  • #16587

    Participant
    Points: 0
    Rank: Member

    Ha, good point!

The topic ‘I don't understand this behavior’ is closed to new replies.