2012-04-12 17 views
6

Trong PowerShell, cú pháp cho if là như vậy:Làm thế nào đến `if (Test-Path ...)` thực sự hoạt động?

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

Một quy tắc cú pháp là cho subexpressions, bạn cần phải sử dụng dấu ngoặc như thế này:

write-output (get-date) 

Vì vậy, với hai quy tắc kết hợp, tôi hy vọng rằng thử nghiệm cho một số đường dẫn cần được viết bằng hai bộ ngoặc đơn như sau:

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

Tuy nhiên, điều này cũng làm việc:

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

và chỉ vì lợi ích của sự hoàn chỉnh, này không công việc:

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

(ở đây, bạn sẽ cần phải quấn subexpression trong ngoặc đơn như bình thường).

Bất cứ ai có thể giải thích các quy tắc cú pháp áp dụng ở đây và làm thế nào mà tôi có thể sử dụng thử nghiệm IF chỉ với một dấu ngoặc đơn? Có một số phép thuật PowerShell hay tôi hiểu nhầm các quy tắc cú pháp cơ bản?

Trả lời

3

Đề cập đến C.2.2 từ Appendix C: The PowerShell grammar trong Bruce Payette của Windows PowerShell in Action, ta có:

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

này cho biết mã thông báo () một phần của cú pháp theo nghĩa đen để nhận biết tuyên bố if và rằng <test> từ tài liệu about_If đề cập đến một đường ống sẽ được giải quyết cho Boolean.

Tiếp theo các quy tắc đường ống dẫn, chúng tôi tìm thấy:

  • Test-Path ... phân tích để một <cmdletCall> của <name> <parameterArgumentToken>,
  • !Test-Path ... kết quả trong một <expressionRule> của <UnaryOperatorToken> <propertyOrArrayReferenceRule>, mà thất bại khi cuộc gọi cmdlet không thể phù hợp với bất động sản đơn giản hoặc mảng quy tắc, trong khi
  • !(Test-Path ...) có thể khớp lệnh gọi cmdlet được lồng tiếng dưới dạng biểu thức con.

Edit: Xem thêm PowerShell 2.0 Language Specification (nhờ Roman's answer to another question).

3

Các dấu ngoặc đơn sau if định nghĩa một subexpression (nếu ngoặc đã được yêu cầu xung quanh Test-Path, sau đó chúng ta sẽ cần dấu ngoặc xung quanh $num -eq 5 và mọi biểu hiện khác) .. Các dấu ngoặc đơn bổ sung sau khi không điều hành là cần thiết vì Test-Path cần phải được đánh giá trước nó có thể được phủ nhận. Bạn có thể thử điều này mà không có câu lệnh if.

này không hoạt động:

PS> !Test-Path NonExistent.file 

này không làm việc:

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

Hãy thử điều này: 'if true'. Nó sẽ cung cấp cho bạn một lỗi * parser *. Tôi không có chuyên gia nhưng điều này dường như với tôi rằng dấu ngoặc đơn thực sự là một ngôn ngữ xây dựng ở đây, không phải là một nhà điều hành subexpression. – Borek

+0

@Borek: Trong PowerShell, tôi nghĩ những gì bạn phải viết là nếu $ True – wunth

Các vấn đề liên quan