简短说明
介绍 PowerShell 如何分析命令。
详细说明
在命令提示符处输入命令时,PowerShell 会将命令文本分解为一系列称为“令牌”的段,然后确定如何解释每个“令牌”。
例如,如果键入:
Write-Host
PowerShell 将以下命令分解为两个令牌,即“Write-Host”和“book”,并独立解释每个令牌。
处理命令时,PowerShell 分析程序在表达式模式或参数模式下运行:
在表达式模式下,字符串值必须包含在引号中。 未用引号括起来的数字将被视为数值(而不是一系列字符)。
在参数模式下,每个值都被视为可扩展字符串,除非它以下列特殊字符之一开头:美元符号 ($)、at 符号 (@)、单引号 (')、双引号 (“) 或左括号 (()。
如果前面有这些字符之一,则该值将被视为值表达式。
下表提供了在表达式模式和参数模式下处理的命令的几个示例,以及这些命令生成的结果。
示例: | 模式 | 结果 |
---|---|---|
2+2 | 表达式 | 4 (整数) |
Write-Output 2+2 | 论点 | “2+2”(字符串) |
Write-Output (2+2) | 表达式 | 4 (整数) |
$a = 2+2 | 表达式 | $a = 4(整数) |
Write-Output $a | 表达式 | 4 (整数) |
Write-Output $a/小时 | 论点 | “4/H” (字符串) |
每个标记都可以解释为某种类型的对象类型,例如 Boolean 或 string。 PowerShell 尝试从表达式中确定对象类型。 对象类型取决于命令所需的参数类型,以及 PowerShell 是否知道如何将参数转换为正确的类型。 下表显示了分配给表达式返回的值的类型的几个示例。
示例: | 模式 | 结果 |
---|---|---|
Write-Output !1 | 参数 | "!1"(字符串) |
Write-Output (!1) | 表达式 | False(布尔值) |
Write-Output (2) | 表达式 | 2 (整数) |
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 开始,您可以使用 stop-parsing 符号。
icacls X:\VMS --% /grant Dom\HVAdmin:(CI)(OI)F
PowerShell 将以下命令字符串发送到 Icacls 程序:
X:\VMS /grant Dom\HVAdmin:(CI)(OI)F