2016-08-08 3 views
1

Powershellでは、if($variable)のテストは何ですか?このテストは、変数が設定されているか、nullであるか、真であるか、または何か他のものですか?

+1

これは、変数の型に依存します。これはPythonやJavaScriptでもよくあることですが、一般に、この文脈で$ trueになるものは「真実」として知られており、この文脈では$ falseになるものは「偽」として知られています。異なる言語でPowerShell - https://blogs.msdn.microsoft.com/powershell/2006/12/24/boolean-values-and-operators/ – TessellatingHeckler

答えて

1

変数が真であるかどうか、またはブール変数でない変数を真に合体できるかどうかをテストします。例えば、これらの各々は偽を返す:

$var #uninitialized 
$var = "" 
$var = $false 
$var = 0 

は、これらの各々は真を返す:

$var = "something" 
$var = $true 
$var = 1 #or any non-zero number 
+0

ありがとう、私はこの構文でいくつかのコードを継承し、それは意味に慣れていたようだ異なるもの。私はこれができる時に答えたものとしてマークします。 – Bob

+1

"*変数に何かが含まれているかどうかをテストします。 PowerShellでは、空の配列は$ falseですが、空のハッシュテーブルは$ trueです。 (空の辞書が偽であるPythonとは異なります)。 – TessellatingHeckler

+2

これは良い答えですが、具体的には、何かが '$ true'か、' $ true'に合体できるかどうかをテストします。つまり、 '[bool] $ var'の値が何であれ条件を使用するように' [bool] 'への暗黙のキャストがあります。この答えが指摘し、TessellatingHecklerが拡張されたときに、どの値が '$ true'または' $ false'に評価されるかの詳細は異なります。 – briantist

1

PowerShellはルーズタイピングを使用し、これの一部として任意の値を条件式として使用することができます。値を真または偽に評価する論理(そのような値はしばしば「真理」および「偽」と呼ばれる)は、System.Management.Automation.LanguagePrimitives.IsTrue関数内にあります。論理は次のとおりです。

  • $nullはfalseと評価されます。
  • $trueおよび$falseは、それらの通常の意味を有する。
  • 数値(int、double、decimalなど)は、ゼロでない場合はtrueです。
  • 文字列が空でない場合は真実です。
  • スイッチパラメータがtrueの場合、発信者によって提供されていると評価されます。
function Test 
{ 
    param ([switch]$Option) 
} 

Test # $Option evaluates to false 
Test -Option # $Option evaluates to true 

# (Technically, $Option is not bool; it is of type SwitchParameter which, 
# for almost all intents and purposes, can be used interchangeably with bool.) 
  • IListを実装する)コレクションは、次のロジックを使用して:空のコレクションはfalseyあります。 1つの要素のみを持つコレクションはそのメンバの真理値を評価します。 2つ以上の要素を持つコレクションは真実です。
  • それ以外は真実です。

落とし穴がいくつかあります:

  • char型が数値型ではありません。実際、[System.Management.Automation.LanguagePrimitives]::IsTrue([char]0)はTrueを返します(最後の節につき)。さらにif([char]0) { "Truthy" } else { "Falsey" }は "Falsey"を返します。私はこれが起こる理由を見つけることができませんでした。
  • 上記のように、正確に1つの要素を持つコレクションは、そのメンバを評価することによって評価されます。だから、自分自身だけを含むコレクションを評価しようとすると(あるいは、それぞれが1つの要素を持つコレクションの再帰的または非常に深くネストされたチェーン)を評価しようとするとどうなりますか?科学のために、あなたはそれをテストすることができます。
$array = New-Object -TypeName System.Object[] 1 # $array = new object[1] 
$array[0] = $array 
if($array) { "Truthy" } else { "Falsey" } 

を(答えは:それでStackOverflowExceptionでプロセスをクラッシュ)

関連する問題