3

在 PowerShell 中,查看如何解析带有逻辑运算符的语句:

> $ast = [System.Management.Automation.Language.Parser]::ParseInput("($true) -and ($false)", [ref]$null, [ref]$null)
> $ast.EndBlock.Statements[0].PipelineElements[0].GetType().Name
CommandExpressionAst
> $ast.EndBlock.Statements[0].PipelineElements[0].Expression


运营商:和
左:(真)
正确:(错误)
错误位置:-和
静态类型:System.Boolean
范围:(真)-和(假)
家长:(真)-和(假)

正如预期的那样,AST 将其视为二进制表达式。但是,如果删除括号,它将被解析为命令。

> $true - 或 $false
真的

> $ast = [System.Management.Automation.Language.Parser]::ParseInput("$true -or $false", [ref]$null, [ref]$null)
> $ast.EndBlock.Statements[0].PipelineElements[0].Gettype().Name
CommandAst

> $ast.EndBlock.Statements[0].PipelineElements[0].CommandElements


StringConstantType : 裸字
值:真
静态类型:System.String
程度:真
父级:真或假

参数名称:或
争论 :
错误位置:-或
范围:-或
父级:真或假

StringConstantType : 裸字
值:假
静态类型:System.String
范围:错误
父级:真或假

我研究了官方 PowerShell 语言规范中的语言语法,但我没有看到它 - 为什么这是一个命令,而不是一个表达式?

4

1 回答 1

3

我猜您不希望 PowerShell 在将字符串传递给 ParseInput 之前对其进行评估。在这种情况下,请使用单引号:

27> $ast = [System.Management.Automation.Language.Parser]::ParseInput( '$true -or $false', [ref]$null, [ref]$null)
28> $ast.EndBlock.Statements[0].PipelineElements[0].Expression


Operator      : Or
Left          : $true
Right         : $false
ErrorPosition : -or
StaticType    : System.Boolean
Extent        : $true -or $false
Parent        : $true -or $false
于 2013-04-16T04:39:58.730 回答