Author Posts

August 14, 2014 at 4:30 am

Hi Guys,

Can someone tell me why I get $TRUE with this?

$foo = @('A','B','C')

if ($foo -Contains 'X') {Write-Output $foo}


if ($foo -Contains 'X' -or 'Z') {Write-Output $foo}
A
B
C

Thanks

August 14, 2014 at 5:07 am

if (($foo -Contains 'X') -or ($foo -Contains 'Z')) {Write-Output $foo}

Should give you what you expect.

August 14, 2014 at 5:17 am

If you read about_Operators, -or is a Logical operator used to 'to connect conditional statements into a single complex conditional.' Comparison operators such as -contains, -like, -eq ... are doing variable comparisons.

if (($foo -Contains 'X') -or ($foo -contains 'Z')) {Write-Output $foo}
if (($foo -Contains 'X') -and ($foo -contains 'Z')) {Write-Output $foo}

August 14, 2014 at 5:55 am

To clarify further, this expression: ($foo -Contains 'X' -or 'Z') is a compound of the following two expressions:

[ul]
[li]$foo -Contains 'X'[/li]
[li]'Z'[/li]
[/ul]

$foo -Contains 'X' is obviously false. The expression 'Z', however, is a string, not a boolean. When strings are cast to booleans (which is what PowerShell is doing here), they're False if they are null or empty, and True if they contain any characters. As you can see if you run this:

[bool]'Z'

The second part of your original compound expression is always true.

August 14, 2014 at 6:09 am

It's interesting that Z returns true if it's casting it as boolean. Boolean is typically translated to a 0 or 1 to indicate a false or true. A bit misleading...

August 14, 2014 at 6:49 am

Boolean is always through of as just 0 and 1, it's more accurately Zero and Non-Zero with 0 being False, and everything else being true. Although this varies from language to language on how it gets used.