为什么我无法在PowerShell中使用bcdedit
编辑说明字段?
例如,在cmd.exe
以下命令中:
bcdedit /set {GUID} description "OS2"
成功完成,更改指定GUID的描述字段,但是当我从Powershell执行相同操作时,出现以下错误:
The set command specified is not valid.
Run "bcdedit /?" for command line assistance.
The parameter is incorrect.
有人可以向我解释一下吗?
答案 0 :(得分:5)
要在PowerShell中将{...}
中包含的值作为文字(原样)传递,您必须引用 ; e.g:
bcdedit /set "{340E0E1A-01EC-4A33-A850-8D6A09FD4CE9}" description "OS2"
与{
不同, }
和cmd.exe
在使用不带引号(它们包含脚本块)时在PowerShell中具有特殊含义,在这种情况下碰巧导致{
和}
只是删除了
引用可以防止这种情况发生。
通用替代品,自PSv3 以来可用,是使用所谓的stop-parsing symbol, --%
,它按原样传递所有剩余的参数,而无需解释PowerShell(扩展%...%
- 封闭的环境变量引用除外):
bcdedit --% /set {340E0E1A-01EC-4A33-A850-8D6A09FD4CE9} description "OS2"
除非需要插入PowerShell变量和表达式,否则 --%
允许按原样重用cmd.exe
命令行,而不必担心PowerShell的引用(转义)要求
通常, PowerShell的元字符(在不引用时具有特殊含义的字符)与cmd.exe
不同,而且数量更多:
cmd.exe
的metachars
& | < >
PowerShell有:
( ) , { } ; @ #
<
,>
,@
和#
在代币的 start 中只有特殊含义。
自PSv5.1起,<
和&
保留用于将来使用。
除此之外,关于变量扩展(插值):
cmd.exe
仅展开 %...%
- 附上的变量名称(例如%PATH%
),而 PowerShell需要$
- 带前缀的变量名称(例如$env:PATH
或$HOME
)或$(...)
- 附带的表达式(子表达式运算符)
"..."
(双引号字符串)中执行。 '...'
(单引号字符串)是PowerShell中的 literal 字符串(内容按原样使用,没有插值),而'
没有特殊内容完全是对cmd.exe
的意思。
要将元字符视为文字 ,您有两种选择:
将它们包含在引用的字符串中 :
cmd.exe
和PowerShell:将它们包含在"..."
中(但可能插入字符串中也包含的任何变量引用/子表达式);例如,"|"
。'...'
;例如,'|'
单独逃离 :
`
- 逃避它们(反击);例如,`|
"..."
,但只有需要才能转义$
,以防止变量/子表达式扩展。cmd.exe
:^
- 逃避它们(插入符号);例如,^|
"..."
的 之外的,遗憾的是,无法转义%
来抑制变量扩展 - 请参阅我的this answer全文。