2016-05-20 6 views
3

この正確な質問が重複しているかどうかはわかりませんが、stackoverflowに関する私の特定の質問が見つからないので、そうではないと思います。

$trueはboolean型である:

($true).getType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Boolean         System.ValueType 

'true'は文字列です:

('true').gettype() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  String         System.Object 

なぜこの条件は本当ですか?

PS C:\WINDOWS\system32> if ('True' -eq $true) {'yes'} else {'no'} 
yes 

真偽値と同じように文字列がTrueと呼ばれるためです。あなたがC#で'true' == trueをすれば、それはcannot convert string to boolエラーとの両方のC#を出力し、PSは、.NETに基づいており、全く同じ構文を持っている

PS C:\WINDOWS\system32> 'hello' -eq $true 
False 
PS C:\WINDOWS\system32> 'true' -eq $true 
True 

:私は他の文字列と比較した場合、異なる結果があります。どうして結果が違うのですか? これは私にとって非常に奇妙なようです。

PowerShellの評価方法は、'true'から$trueまでですか?

+0

@Mattない正確に。彼らはすべての理由を参照してください$ true -eq '文字列' =真、私の質問はなぜ真の文字列 'true' -eq $真であり、他の '文字列' -eq $ trueはfalseです。私もあなたが望んでいるそれらの質問を見ましたが、彼らは同じではありません – SimonS

+1

それは完全な欺瞞ではないので、私はそれを削除しました。しかし、すべての答えは、LHSとRHSの議論とキャストについて話すので、そのことが当てはまります。あなたはそれの特定の場合を指しているので、うまく動作します。関連する可能性のある他の質問を読む場合は、ここにリンクして、あなたの質問に答えなかったことを説明してください。 – Matt

+0

@Matt私は全く同意します。答えは同じです。多分私はあまりにもショックを受けてPowerShellがこのようなものを評価するので、私は十分に慎重に答えを読まなかったでしょう。しかし、なぜ「真実」 - 「真」と答えた人にとって、この質問は完全な説明を与えてくれます。 – SimonS

答えて

4

PowerShellでは、演算子のオーバーロードは、左側(lhs)の引数によって決まります。

これは、文字列をlhs引数として指定すると、パーサーは右側(rhs)も同様に文字列に変換しようとします。

文字列にキャストすると、$trueが文字列 "True"として出力されます。これは、PowerShellの文字列比較演算子がすべてデフォルトで大文字と小文字を区別しないため、 "true"になります。

この操作:

'true' -eq $true 

はあなたのif条件を満たし、$trueであることを起こる

'true' -eq 'True' 

として解釈されます。 $true


、これはまた、他の方法で回避を動作するように起こるブールに変換する非空の文字列、理由、$trueに評価されます。つまり

$true -eq 'true' 

のように解釈されます。
$true -eq $true 

文字列が「偽」が偶然にが文字列「偽」が空ではないという理由だけで、$trueとして評価されますので、混乱への広告、:

PS C:\> $true -eq "true" 
True 
PS C:\> $true -eq "false" 
True 
PS C:\> $true -eq "" 
False 
+0

'$ true -eq 'true''も真です。 Powershellは文字列をブール値と同じ値にすると文字列をブール値に変換できますか? – SimonS

+0

正解 - 空でない文字列は '$ true'、空文字列は' $ false' –

+0

最初は少し直感的に見えるかもしれませんが、演算子は** lhs **によって常に決定されます。あなたは簡単に行動を予測することができます。はい、かなりいいと思うでしょう:) –

関連する問題