2013-04-09 3 views
8

Глядя, что help section about_Comparison_Operators of PowerShell я не понимаю этого:PowerShell Logic

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

Nothing слева соответствует право так ничего не возвращается даже не в $null.

Я не понимаю этого:

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

Это потому, что это первый делает $true -eq $false который возвращает Ложные, а затем принимать что Ложные и делать $false -eq $false, которая возвращает Истинную?

Подробнее

Причина ниже возвращает ложь, потому что это сравнение строки в массив, правильно? Строка не равна массиву.

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

Ответа на этот вопрос?

Подробнее digging показывает, что $true равно объекту.

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

Это ценности, которые имеют значение.

PS C:\> $true -eq [int]0 
False 
+0

+1 Хороший вопрос, но могу ли я спросить, для чего он нужен? У меня возникают проблемы, когда я вижу сценарий, где я могу его использовать. –

+0

Чтобы узнать, как работает PowerShell. Также смотря на [link] (http://technet.microsoft.com/en-us/library/hh847759.aspx), не уверен, почему '' abc "-eq" abc "," def "' не работает. –

+0

[Вам нужно заработать свои полоски] (http://beefycode.com/post/PowerShell-Mini-game-Equality.aspx) –

ответ

7

Мне нравятся фундаментальные вопросы о поведении и особенностях такого языка ... Дайте мне повод прочитать спецификацию языка PowerShell.

Вы можете скачать указанную спецификацию: 2.0 и 3.0. См. Раздел 7.8.1 - Равенство и реляционные операторы.

Для первой части вопроса, то, что на самом деле возвращается - пустой массив, который иллюстрируется: ($false,$false -eq $true).psbase

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

Из спецификации -

Если значение обозначается левый операнд не является сборником, результат имеет тип bool. В противном случае результатом является, возможно, пустой неограниченный 1-мерный массив, содержащий элементы коллекции , которые проверяют True по сравнению со значением, обозначенным правым операндом .

Для второй части, поскольку левый операнд сам по себе является bool, я думаю, что это всегда будет результат. Это происходит только тогда, когда правый операнд представляет собой коллекцию.

Некоторые примеры:

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

Все эти возврата $true. Conversly все они возвращают $false

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

тип левого операнда является очень важным. Этот wil возвращает $true: $false -eq 0, потому что правый операнд может быть отнесен к типу левого операнда.

+1

Энди на отметке. Логическое выражение обрабатывается слева направо, а тип левого операнда определяет, как интерпретируется правый операнд. Если у вас возникли проблемы с визуализацией спецификации, сломайте логику и изучите роли, которые выполняет PowerShell: [bool] 0; [BOOL] 1; [BOOL] @(); [BOOL] @ ($ ложь); [BOOL] @ ($ ложь, ложь $); [BOOL] ''; [BOOL] $ Null; #ad nauseum ... – beefarino

+0

Я бы ожидал, что они оценят то же самое, но они этого не делают: [bool] (@ (1) -eq 1) [bool] (1 -eq @ (1)) – mjolinor

+0

: '-eq' возвращает' 1' из коллекции, а затем отбрасывает в bool значение '$ true'. Второй '-eq' возвращает boolean, потому что левый операнд является масштабируемым, а cast как bool оставляет его false. Я не уверен, что PowerShell делает, чтобы определить логическое значение, когда правый операнд является коллекцией. Спецификация ничего не говорит об этом конкретно, поэтому его забавная игра для нас выводит: D –

2

Возможно, оператор -eq оценивает свое существование (иначе не $null), а не их стоимость.

Возможно, как и в случае с IF?

PS> if("anyval"){$true}else{$false} 
True 

This ответ предоставляется @Joey может также оказаться полезным.

+2

На самом деле, я думаю, что ссылка, которую вы предоставляете, является ответом. – zdan

3

Лучшее предположение:

Это оценки, как правда, потому что это массив с более чем одним членом. Массив не имеет метода ToBoolean().

До тех пор, пока это скаляр или массив, у которого есть только один член, Powershell может принуждать это к скаляру и перейти к методу ToBoolean() для члена. Как только он переходит к 2 или более, он всегда возвращает True, независимо от того, что представляют собой элементы. Если нет ToBoolean(), и он возвращается к стандартным методу ToString(), который всегда будет оцениваться как True.

Возможно, нет.

+0

Я добавил метод ToBoolean, возвращающий false в arraylist, но сравнение вернуло ложное тестирование '$ false -eq $ array_list_with_to_bool'. Поэтому я не уверен, что это из-за существования метода с именем ToBoolean. –