2012-04-12 119 views
6

在PowerShell中,語法if是這樣:`if(Test-Path ...)`實際上是如何工作的?

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

另一個語法規則是:爲子表達式,你需要使用圓括號這樣的:

write-output (get-date) 

所以這兩個規則結合起來,我預計對於某些路徑的測試需要使用兩組括號來編寫:

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

然而,這也適用:

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

,只是爲了完整起見,本工作:

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

(在這裏,你將需要包裝的子表達式像往常一樣在括號中)。

任何人都可以解釋這裏適用的語法規則,以及如何才能使用帶有一個括號的IF測試?這是PowerShell的一些魔力還是我誤解了基本的語法規則?

回答

3

在布魯斯·帕耶特的Windows PowerShell in Action參考C.2.2從Appendix C: The PowerShell grammar,我們有:

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

這指示()令牌爲是識別if語句的文字語法的一部分,而about_If文檔中的<test>指的是將被解析爲布爾值的管線。

繼管道的規則,我們發現:

  • Test-Path ...解析到<name> <parameterArgumentToken><cmdletCall>
  • !Test-Path ...導致的<UnaryOperatorToken> <propertyOrArrayReferenceRule><expressionRule>,從而未能在該cmdlet呼叫無法比擬的簡單的屬性或數組規則,而
  • !(Test-Path ...)能夠將帶括號的cmdlet調用作爲子表達式進行匹配。

編輯:參見PowerShell 2.0 Language Specification(感謝Roman's answer to another question)。

3

if定義子表達式(如果括號是圍繞Test-Path需要,那麼我們就需要括號圍繞$num -eq 5和所有其他表達式)括號..未要求操作後,因爲Test-Path需要之前評估附加括號它可以被否定。你可以在沒有if語句的情況下嘗試。

這不起作用:

PS> !Test-Path NonExistent.file 

這並不工作:

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

試試這個:'if true'。它會給你一個*解析器*錯誤。我不是專家,但在我看來,括號確實是一種語言結構,而不是一個子表達式運算符。 – Borek 2012-04-16 13:58:01

+0

@Borek:在PowerShell中,我認爲你必須寫的是 if $ True – wunth 2015-04-13 22:17:50