これは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
ハッシュテーブルは値の集合ではありません。これは、キーと値のプロパティを持つ辞書エントリのコレクションです。私はそれが一貫した表現ではないので、ハッシュテーブルに対して比較演算子を使用することは期待できません。キーの名前や値をテストしていますか? – mjolinor
@ mjolinor:現時点では私は実験中です。これまで、配列に要素があるかどうかを調べるために 'if($ a){...}'の行に沿ってテストを行ってきました。私はハッシュテーブルと同様のことをすることができると仮定し、ハッシュテーブルが異なる振る舞いを示すと驚いた。 –
参照:https://stackoverflow.com/a/37058391/1701026 – iRon