关于分析
简短说明
介绍 PowerShell 如何分析命令。
详细说明
在命令提示符处输入命令时,PowerShell 将命令文本分解为一系列称为“令牌”的段,然后确定如何解释每个“令牌”。
例如,如果键入:
Write-Host 书
PowerShell 将以下命令分解为两个标记(“Write-Host”和“book”),并单独解释每个令牌。
处理命令时,PowerShell 分析程序在表达式模式或参数模式下运行:
在表达式模式下,字符串值必须包含在引号中。 未用引号括起来的数字被视为 (数值,而不是) 的一系列字符。
在参数模式下,每个值被视为可展开的字符串,除非它以以下特殊字符之一开头:美元符号 ($) 、at sign (@) 、单引号 (') 、双引号 (“) 或左括号 ( () 。
如果前面有其中一个字符,则该值被视为值表达式。
下表提供了在表达式模式和参数模式下处理的命令的几个示例,以及这些命令生成的结果。
示例 | 模型 | 结果 |
---|---|---|
2+2 | Expression | 4 (整数) |
Write-Output 2+2 | 参数 | “2+2” (字符串) |
Write-Output (2+2) | Expression | 4 (整数) |
$a = 2+2 | Expression | $a = 4 (整数) |
Write-Output $a | Expression | 4 (整数) |
Write-Output $a/H | 参数 | “4/H” (字符串) |
每个标记都可以解释为某种对象类型,例如布尔值或字符串。 PowerShell 尝试从表达式中确定对象类型。 对象类型取决于命令所需的参数类型以及 PowerShell 是否知道如何将参数转换为正确的类型。 下表显示了分配给表达式返回的值的几个类型示例。
示例 | 模型 | 结果 |
---|---|---|
Write-Output !1 | 参数 | “!1” (字符串) |
Write-Output (!1) | 表达式 | 假 (布尔) |
Write-Output (2) | 表达式 | 2 (整数) |
PowerShell 3.0 中引入的 stop-parsing 符号 (-%) 指示 PowerShell 避免将输入解释为 PowerShell 命令或表达式。
在 PowerShell 中调用可执行程序时,请将 stop-parsing 符号放在程序参数前面。 此方法比使用转义字符来防止错误解释要容易得多。
当遇到停止分析符号时,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