7

在 PowerShell 中,for 的语法if如下:

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 魔法还是我误解了基本语法规则?

4

2 回答 2

4

参考附录 C 中的 C.2.2: Bruce Payette 的Windows PowerShell in Action中的 PowerShell 语法,我们有:

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

这表明(and)标记是用于识别if语句的文字语法的一部分,并且文档中的<test>theabout_If指的是将被解析为布尔值的管道。

遵循管道规则,我们发现:

  • Test-Path ...解析<cmdletCall><name> <parameterArgumentToken>,
  • !Test-Path ...导致<expressionRule>of <UnaryOperatorToken> <propertyOrArrayReferenceRule>,当 cmdlet 调用无法匹配简单属性或数组规则时,它会失败,而
  • !(Test-Path ...)能够将带括号的 cmdlet 调用匹配为子表达式。

编辑:另请参阅PowerShell 2.0 语言规范(感谢Roman 对另一个问题的回答)。

于 2012-06-17T21:21:39.830 回答
3

if定义子表达式之后的括号(如果Test-Path需要括号,那么我们需要括号$num -eq 5和所有其他表达式).. not 运算符之后的附加括号是必需的,因为Test-Path需要在它被否定之前进行评估。您可以在没有 if 语句的情况下尝试此操作。

这不起作用:

PS> !Test-Path NonExistent.file

这确实有效:

PS> !(Test-Path NonExistent.file)
于 2012-04-12T13:35:11.853 回答