关于分析
简短说明
介绍 PowerShell 如何分析命令。
详细说明
在命令提示符处输入命令时,PowerShell 将命令文本分解为一系列称为 标记 的段,然后确定如何解释每个标记。
例如,如果键入:
Write-Host book
PowerShell 将命令分解为两个标记, Write-Host
和 book
,并使用两种主要分析模式之一(表达式模式和参数模式)独立解释每个标记。
注意
当 PowerShell 分析命令输入时,它会尝试将命令名称解析为 cmdlet 或本机可执行文件。 如果命令名称没有完全匹配,PowerShell 会将 Get-
命令作为默认谓词追加到该命令前面。 例如,PowerShell 分析 Process
为 Get-Process
。 出于以下原因,不建议使用此功能:
- 效率低下。 这会导致 PowerShell 多次搜索。
- 将首先解析同名的外部程序,因此可能不会执行预期的 cmdlet。
Get-Help
和Get-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}
) 。 - 逗号 (
,
) 引入作为数组传递的列表,除非要调用的命令是本机应用程序,在这种情况下,它们被解释为可展开字符串的一部分。 不支持初始、连续或尾随逗号。
嵌入表达式的值将转换为字符串。
下表提供了在表达式模式和参数模式下处理的值的几个示例,以及这些值的计算。 假设 变量a
4
的值为 。
示例 | 模型 | 结果 |
---|---|---|
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 平台。