2012-04-12 17 views
6

, if için sözdizimi olarak böyledir: bu iki Yani`if (Test-Path ...)` aslında nasıl çalışır? PowerShell'de

write-output (get-date) 

:

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

Başka sözdizimi kural subexpressions için, böyle parantez kullanmak gerekir olmasıdır Kurallar birleştirildiğinde, bazı yolların sınanması gibi iki parantez ile yazılması gerekir:

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

Ancak bu da çalışır:

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

ve sadece şeyiyle uğruna, bu yapar değil eser:

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

(, sen alt ifade sarmak gerekir her zamanki gibi parantez içinde).

Burada uygulanan sözdizimi kurallarını açıklayan herhangi biri olabilir mi ve IF testini yalnızca bir parantez ile birlikte kullanabileceğim nasıl olur? Bazı PowerShell sihir mi yoksa temel sözdizimi kurallarını yanlış anlıyor muyum? if bir alt ifade define (parantez Test-Path etrafında gerekli olsaydı, o zaman etrafında parens $num -eq 5 ve diğer her ifadeyi gerekir) sonra

cevap

3

Bruce Payette en Windows PowerShell in Action yılında Appendix C: The PowerShell grammar gelen C.2.2 değinen elimizde:

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

Bu ( ve ) simgelerini belirtir. Bir if bildirimini tanımak için sözdizimsel sözdiziminin bir kısmı ve about_If belgelerinden <test> belgelerinin bir Boole'ye çözülecek bir boru hattını ifade etmesi.

boru hattı kuralları gereğince, buluruz:

  • Test-Path ...
  • !Test-Path ... sonuç <UnaryOperatorToken> <propertyOrArrayReferenceRule> bir <expressionRule> yılında, bir <cmdletCall><name> <parameterArgumentToken> ait ayrıştırır, cmdlet'in çağrı basit özellik ya da dizi yakıştıramadığında başarısız olan kuralı,
  • !(Test-Path ...), parantezli cmdlet çağrısını bir alt ifade olarak eşleştirebilir.

Düzenleme: Ayrıca bkz PowerShell 2.0 Language Specification (Roman's answer to another question sayesinde).

3

parantez .. Test-Path ihtiyaçlar önce değerlendirilmesi için değil operatör gereklidir sonra ek parantez reddedilebilir. If ifadesi olmadan bunu deneyebilirsiniz.

Bu işe yaramazsa:

PS> !Test-Path NonExistent.file 

Bu yaptığı işlerde:

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

Bunu deneyin: 'true ise. Size bir * ayrıştırıcı * hatası verecektir. Uzman değilim ama bu bana parantezlerin burada bir alt-ifade operatörü değil, bir dil yapısı olduğunu gösteriyor. – Borek

+0

@Borek: PowerShell'de yazmanız gereken şey, $ True ise – wunth