1

を動作していないこれは私のコードです:これらの機能の両方が$falseに評価するときFuncOne() - およびFuncTwo()

if (FuncOne($valOne) -and FuncTwo($valTwo)) { 
    ... 
} 

、if文の中のコードはまだ実行されます。何故ですか?これも期待どおりに動作しません。

このように記述すると、期待どおりに動作します。

$a = FuncOne($valOne) 
$b = FuncTwo($valTwo) 

if($a -and $b) { 
    ... 
} 

何が起こっているのですか?

答えて

3

これは、構文の問題です。

PowerShellで関数を呼び出すための正しい構文ではありません。

functionName($arg1[,$arg2,$arg3]) 

ではなく、むしろ:

functionName [-parameterName1] $arg1 [[-parameterName2] $arg2] 

さあ、あなたif()サンプルの表現にこれを適用してみましょう:

FuncOne $valOne -and FuncTwo $valTwo 

明示的なパラメータ名(-ParameterName)演算子(-and)は完全に区別できません。-andがパラメータ名または演算子として解釈されるはずかどうかをパーサが判別する方法はありません。また、文字列リテラルFuncTwoもパラメータ引数として解釈できます。これはまさに何が起こるかです。 へのパーサーのために

()と評価の順序を強制する、あなたは、2つの別々の式として式を扱うつもりを知っている:

if ((FuncOne $valOne) -and (FuncTwo $valTwo)) { 
    # They both returns a truthy value 
} 
2

あなたはactualy するためにParentheseのに機能を配置する必要がありにそれを呼び出す:

if ((FuncOne($valOne)) -and (FuncTwo($valTwo))) { 
    ... 
} 
+0

だから、PowerShellはFuncOneがゆえ、何かのように定義されて考えています、 $ trueに強制する? – sirdank

+1

いいえ、それは '-and'がパラメータ名で、' FuncTwo'が引数であると考えます –

+1

マティアスが正しいと彼の答えは問題を説明します。 –