无法使用powershell中的bcdedit filelds进行编辑 - cmd.exe命令行失败

时间:2016-12-08 02:19:42

标签: powershell cmd parameter-passing bcdedit

为什么我无法在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.

有人可以向我解释一下吗?

1 个答案:

答案 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中的子表达式扩展)也在"..."(双引号字符串)中执行。
  • '...'(单引号字符串)是PowerShell中的 literal 字符串(内容按原样使用,没有插值),而'没有特殊内容完全是对cmd.exe的意思。

将元字符视为文字 ,您有两种选择:

  • 将它们包含在引用的字符串中

    • cmd.exe和PowerShell:将它们包含在"..."中(但可能插入字符串中也包含的任何变量引用/子表达式);例如,"|"
    • 仅限PowerShell:将其封在'...';例如,'|'
  • 单独逃离

    • PowerShell:` - 逃避它们(反击);例如,`|
      • 这也适用于"...",但只有需要才能转义$,以防止变量/子表达式扩展。
    • cmd.exe^ - 逃避它们(插入符号);例如,^|
      • 这仅适用于"..." 之外的,遗憾的是,无法转义%来抑制变量扩展 - 请参阅我的this answer全文。