关于分析

简短说明

介绍 PowerShell 如何分析命令。

详细说明

在命令提示符处输入命令时,PowerShell 将命令文本分解为一系列称为 标记 的段,然后确定如何解释每个标记。

例如,如果键入:

Write-Host book

PowerShell 将命令分解为两个标记, Write-Hostbook,并使用两种主要分析模式之一(表达式模式和参数模式)独立解释每个标记。

注意

当 PowerShell 分析命令输入时,它会尝试将命令名称解析为 cmdlet 或本机可执行文件。 如果命令名称没有完全匹配,PowerShell 会将 Get- 命令作为默认谓词追加到该命令前面。 例如,PowerShell 分析 ProcessGet-Process。 出于以下原因,不建议使用此功能:

  • 效率低下。 这会导致 PowerShell 多次搜索。
  • 将首先解析同名的外部程序,因此可能不会执行预期的 cmdlet。
  • Get-HelpGet-Command 无法识别无动词名称。

表达式模式

表达式模式用于合并表达式,这些表达式是脚本语言中的值操作所必需的。 表达式是 PowerShell 语法中值的表示形式,可以是简单或复合的,例如:

文本表达式是其值的直接表示形式:

'hello', 32

变量表达式携带它们引用的变量的值:

$x, $script:path

运算符结合其他表达式进行求值:

- 12, -not $Quiet, 3 + 7, $input.Length -gt 1
  • 字符串文本 必须包含在引号中。
  • 除非) 转义,否则数字被视为数值而不是 (一系列字符。
  • 运算符(包括 和 -not-一元运算符)和二元运算符(如 +-gt)被解释为运算符,并对其参数 (操作数) 应用各自的运算。
  • 属性和转换表达式 被分析为表达式,并应用于从属表达式,例如 [int] '7'
  • 变量引用 的计算结果为它们的值,但 展开 (即禁止粘贴预填充的参数集) ,并导致分析程序错误。
  • 任何其他内容都将被视为要调用的命令。

参数模式

分析时,PowerShell 首先将输入解释为表达式。 但是,当遇到命令调用时,分析将继续在参数模式下进行。

参数模式旨在分析 shell 环境中的命令的参数和参数。 所有输入都被视为可展开的字符串,除非它使用以下语法之一:

  • 仅当 (后跟有效的变量名称时,美元符号 ($) 才开始变量引用,否则它将解释为可展开字符串) 的一部分。
  • ('") 开始字符串值的引号
  • 括号 (()) 划分新表达式。
  • subexpression 运算符 ($(...)) 划分嵌入表达式。
  • 大括号 ({}) 划分新脚本块。
  • 初始 at sign (@) 开始表达式语法,例如展开 () @args 、数组 (@(1,2,3)) 和哈希表 (@{a=1;b=2}) 。
  • 逗号 (,) 引入作为数组传递的列表,除非要调用的命令是本机应用程序,在这种情况下,它们被解释为可展开字符串的一部分。 不支持初始、连续或尾随逗号。

嵌入表达式的值将转换为字符串。

下表提供了在表达式模式和参数模式下处理的值的几个示例,以及这些值的计算。 假设 变量a4的值为 。

示例 模型 结果
2 表达式 2 (整数)
`2 Expression “2” (命令)
echo 2 Expression 2 (整数)
2+2 Expression 4 (整数)
echo 2+2 参数 “2+2” (字符串)
echo(2+2) Expression 4 (整数)
$a Expression 4 (整数)
echo $a Expression 4 (整数)
$a+2 Expression 6 (整数)
echo $a+2 参数 4+2 (字符串)
$- 参数 “$-” (命令)
echo $- 参数 “$-” (字符串)
a$a Expression “a$a” (命令)
echo a$a 参数 “a4” (字符串)
a'$a' Expression “a$a” (命令)
echo a'$a' 参数 “a$a” (字符串)
a"$a" Expression “a$a” (命令)
echo a"$a" 参数 “a4” (字符串)
a$(2) Expression “a$ (2) ” (命令)
echo a$(2) 参数 “a2” (字符串)

每个标记都可以解释为某种对象类型,例如布尔值或字符串。 PowerShell 尝试从表达式中确定对象类型。 对象类型取决于命令所需的参数类型以及 PowerShell 是否知道如何将参数转换为正确的类型。 下表显示了分配给表达式返回的值的几个类型示例。

示例 模型 结果
Write-Output !1 参数 “!1” (字符串)
Write-Output (!1) 表达式 false (布尔)
Write-Output (2) 表达式 2 (整数)
Set-Variable AB A,B 参数 “A”、“B” (数组)
CMD /CECHO A,B 参数 “A,B” (字符串)
CMD /CECHO $AB 表达式 “A”、“B” (数组)
CMD /CECHO :$AB 参数 “:A B” (字符串)

PowerShell 3.0 中引入的停止分析符号 (--%) ,指示 PowerShell 不要将输入解释为 PowerShell 命令或表达式。

在 PowerShell 中调用可执行程序时,将停止分析符号放在程序参数之前。 此方法比使用转义字符来防止错误解释要容易得多。

当遇到停止分析符号时,PowerShell 会将行中的剩余字符视为文本。 它执行的唯一解释是将值替换为使用标准 Windows 表示法的环境变量,例如 %USERPROFILE%

停止分析符号仅在下一个换行符或管道字符之前有效。 不能使用延续字符 (`) 来扩展其效果,也不能使用命令分隔符 (;) 终止其效果。

例如,以下命令调用 Icacls 程序。

icacls X:\VMS /grant Dom\HVAdmin:(CI)(OI)F

若要在 PowerShell 2.0 中运行此命令,必须使用转义字符来防止 PowerShell 错误解释括号。

icacls X:\VMS /grant Dom\HVAdmin:`(CI`)`(OI`)F

从 PowerShell 3.0 开始,可以使用停止分析符号。

icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F

PowerShell 将以下命令字符串发送到 Icacls 程序:

X:\VMS /grant Dom\HVAdmin:(CI)(OI)F

注意

停止分析符号仅适用于 Windows 平台。

另请参阅

about_Command_Syntax