Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PowerShell Logic

Looking that the help section about_Comparison_Operators of PowerShell I understand this:

PS C:\> $false,$false -eq $true
PS C:\> 

Nothing from the left matches the right so nothing is returned not even a $null.

I don't understand this:

PS C:\> $true -eq $false,$false
True
PS C:\> 

Is it because it's first doing $true -eq $false which returns False, and then taking that False and doing $false -eq $false which returns True?

More Info

The reason the below returns false is because it's comparing a string to an array, correct? A string is not equal to an array.

PS C:\> "abc" -eq "abc","def"
False

Answer?

More digging shows that $true is equal to an object.

PS C:\> $true -eq [array]
True
PS C:\> $true -eq [string]
True
PS C:\> $true -eq [int]
True
PS C:\> $true -eq [bool]
True

It's the values of those object that matter.

PS C:\> $true -eq [int]0
False
like image 726
E.V.I.L. Avatar asked Apr 09 '13 21:04

E.V.I.L.


People also ask

Is PowerShell an in demand skill?

Easy Automation Windows PowerShell includes more than one hundred basic core cmdlets, and you can write your own cmdlets and share them with other users. Knowing how to design cmdlets and perform PowerShell scripting are in-demand skills for companies large and small throughout North America and Europe.

Why do you use logical operators PowerShell?

The PowerShell logical operators connect expressions and statements, allowing you to use a single expression to test for multiple conditions.

What are PowerShell commands?

Commands for PowerShell are known as cmdlets (pronounced command-lets). In addition to cmdlets, PowerShell allows you to run any command available on your system.

What does $() mean in PowerShell?

Subexpression operator $( ) For a single result, returns a scalar. For multiple results, returns an array. Use this when you want to use an expression within another expression. For example, to embed the results of command in a string expression. PowerShell Copy.


2 Answers

I like fundamental questions about the behavior and features of the language like this... Give's me an excuse to read the PowerShell language specification.

You can download said specification: 2.0 and 3.0. See section 7.8.1 - Equality and relational operators.

For the first part of the question, something actually is returned - an empty array, which is illustrated by: ($false,$false -eq $true).psbase

Length         : 0
LongLength     : 0
Rank           : 1
SyncRoot       : {}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 0

From the spec -

If the value designated by the left operand is not a collection, the result has type bool. Otherwise, the result is a possibly empty unconstrained 1-dimensional array containing the elements of the collection that test True when compared to the value designated by the right operand.

For the second part, because the left operand is itself a bool, I think that it always be the result. This is only when the right operand is a collection.

Some examples:

$true -eq 1,2,3,4
$true -eq '','','',''
$true -eq '',1,$true,$false
$true -eq $null,$false,1,''

All of these return $true. Conversly all of these return $false

$false -eq 1,2,3,4
$false -eq '','','',''
$false -eq '',1,$true,$false
$false -eq $null,$false,1,''
$false -eq $true,$true,$true

The type of the left operand is very important. This wil return $true: $false -eq 0 because the right operand is castable to the type of the left operand.

like image 68
Andy Arismendi Avatar answered Oct 13 '22 00:10

Andy Arismendi


Best guess:

It's evaluating as True because it's an array with more than one member. An array does not have a ToBoolean() method.

As long as it's a scalar, or an array with only has one member Powershell can coerce that to a scalar and get to a ToBoolean() method on the member. As soon as it goes to 2 or more, it always returns True, regardless of what the elemets are. If there's no ToBoolean(), and it falls back to the default ToString() method, that's always going to evaluate to True.

Or maybe not.

like image 25
mjolinor Avatar answered Oct 13 '22 00:10

mjolinor