2012-04-12 14 views
6

は、ifため構文はようにある:これら2つとので`if(Test-Path ...)`が実際にどのように機能しますか? PowerShellでは

write-output (get-date) 

if (<test1>) 
    {<statement list 1>} 
[elseif (<test2>) 
    {<statement list 2>}] 
[else 
    {<statement list 3>}] 

別の構文規則は、部分式のために、あなたはこのような括弧を使用する必要があるということですルールを組み合わせると、私はいくつかのパスのテストがこのような2組のかっこで書かれる必要があると期待します:

if ((Test-Path ...)) { 
    # do something 
} 

しかし、これも動作します:

if (Test-Path ...) { 
    # do something 
} 

とちょうど完全性のために、この仕事しません:

if (!Test-Path ...) { 
    # do something 
} 

(ここでは、あなたが部分式をラップする必要があります通常のようにかっこ内に)。

ここで適用される構文規則は誰でも説明できますが、どのようにしてIFテストを1つの括弧でのみ使用できますか?それはPowerShellの魔法ですか?基本的な構文規則を誤解していますか? ifは部分式を定義します(括弧はTest-Pathの周りに必要とされた場合は、その後、私たちは周りの括弧$num -eq 5およびその他すべての表現を必要とする)の後に

答えて

3

ブルース・ペイエットのWindows PowerShell in Action、我々が持っているでAppendix C: The PowerShell grammarからC.2.2を参照:

<ifStatementRule> = 
    'if' '(' <pipelineRule> ')' <statementBlockRule> 
    [ 'elseif' '(' <pipelineRule> ')' <statementBlockRule> ]* 
    [ 'else' <statementBlockRule> ]{0|1} 

この()というトークンを示すifステートメントを認識するためのリテラル構文の一部であり、about_Ifドキュメントの<test>は、ブール値に解決されるパイプラインを参照しています。

パイプラインの規則に従い、我々は見つける:

  • Test-Path ...は、コマンドレットの呼び出しは、単純なプロパティまたは配列と一致しないことができたときに失敗し<UnaryOperatorToken> <propertyOrArrayReferenceRule><expressionRule><name> <parameterArgumentToken><cmdletCall>
  • !Test-Path ...結果に解析し、一方、
  • !(Test-Path ...)は、サブコマンドとしてカッコで囲まれたコマンドレットコールを照合することができます。

編集:PowerShell 2.0 Language SpecificationRoman's answer to another questionに感謝)を参照してください。

3

括弧.. Test-Pathニーズが前に評価されるので、ないオペレータが必要とされた後に、追加の括弧否定することができます。あなたはif文なしでこれを試すことができます。

これは動作しません:

PS> !Test-Path NonExistent.file 

これは、作業を行います。

PS> !(Test-Path NonExistent.file) 
+0

これを試してください:「真なら」。 *パーサ*エラーが発生します。私は専門家ではありませんが、これは私にはカッコが実際には副次演算子ではなく、ここでは言語構築物であると思われます。 – Borek

+0

@Borek:PowerShellでは、書く必要があるのは if $ True – wunth

関連する問題