2017-11-06 14 views
2

私はPowershell 4.0でTrueとFalseを試しています。空の配列と空のハッシュテーブルを見たときにここでの結果は以下のとおりです。空の配列がFalseと評価されたときに、空のPowershellハッシュテーブルがTrueに評価されるのはなぜですか?

PS C:\Users\simon> $a = @()  
PS C:\Users\simon> if ($a) { Write-Host "True" } else { Write-Host "False" } 
False 

PS C:\Users\simon> $a = @{}  
PS C:\Users\simon> if ($a) { Write-Host "True" } else { Write-Host "False" } 
True 

空の配列がFalseと評価されたときに、空のハッシュテーブルがTrueに評価されないのはなぜ?

PowershellのドキュメントAbout Comparison Operatorsによると:入力値の集合である場合

、比較演算子は、任意のマッチング値を返す 。コレクションに一致するものがない場合、 比較演算子は何も返しません。

これからは、どちらもコレクションであるため、ハッシュテーブルと配列が両方とも空のときに同じように動作することが期待されます。 if句に何も返さないので、私は両方ともFalseと評価すると考えています。

+1

ハッシュテーブルは値の集合ではありません。これは、キーと値のプロパティを持つ辞書エントリのコレクションです。私はそれが一貫した表現ではないので、ハッシュテーブルに対して比較演算子を使用することは期待できません。キーの名前や値をテストしていますか? – mjolinor

+0

@ mjolinor:現時点では私は実験中です。これまで、配列に要素があるかどうかを調べるために 'if($ a){...}'の行に沿ってテストを行ってきました。私はハッシュテーブルと同様のことをすることができると仮定し、ハッシュテーブルが異なる振る舞いを示すと驚いた。 –

+0

参照:https://stackoverflow.com/a/37058391/1701026 – iRon

答えて

1

これはTrue/Falseの問題ではありません。ブール演算子$true$falseを使用してこれをテストできます。

if($a -eq $null)  > False 
if($h -eq $null)  > False 

としてiRon's linkあたり、Countは、ハッシュテーブル/配列が空であるかどうかを確認するためのより良い試験である:私は自動変数$nullことも@{}

PS C:\> $a = @() 
PS C:\> $h = @{} 
PS C:\> if ($a -eq $true) { Write-Host "True" } else { Write-Host "False" } 
False 

if ($h -eq $true) > False 
if ($a -eq $false) > False 
if ($h -eq $false) > False 

等しくない空のハッシュテーブルとして$hを使用しました。 Related Length

異なる振る舞いは基本型に関係します。

PS C:\> $a.GetType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 

PS C:\> $h.GetType() 

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

それはどのようにifステートメント作品やLength財産、AFAICSで行うことです。以下は、複数のStackOverflow投稿と外部リンクからの私の(間違いなく不安な)理解です。


Get-Member動作が異なっている - 変数のLength性質が異なっているMathias's explanation

$a | Get-Member   # Error - Get-Member : You must specify an object for the Get-Member cmdlet. 
$h | Get-Member   # TypeName: System.Collections.Hashtable. Has Count method, no Length property 
Get-Member -InputObject $a # TypeName: System.Object[]. Has Count method, has Length property 

を参照してください。しかし、ハッシュテーブルにはLengthプロパティ(see mjolinar's answer)がありません。 Ansgar's linkとの組み合わせ

$a.Length > 0 
$h.length > 1 

それは暗黙のうちにLengthプロパティを取得しているように見えるようif文で異なる動作を説明します。

if ($a.Length -eq $true) > False 
if ($h.Length -eq $true) > True 

[String]のIsNullOrEmpty methodを使用してください。ネットクラスは$nullと比べて出力が異なりますが、これはまたLengthに依存しているためです。

if ([string]::IsNullOrEmpty($a)) > True 
if ([string]::IsNullOrEmpty($h)) > False 
関連する問題