无法在 powershell 中使用 bcdedit 字段进行编辑 - cmd.exe 命令行失败

Unable to edit with bcdedit filelds in powershell - cmd.exe command line fails

为什么我不能在 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.

谁能给我解释一下?

将包含在{...}中的值作为文字(原样)传递给PowerShell,您必须引用;例如:

bcdedit /set "{340E0E1A-01EC-4A33-A850-8D6A09FD4CE9}" description "OS2"
cmd.exe 不同,

{} 元字符 ,即当不加引号使用时在 PowerShell 中具有特殊含义的字符(它们包含一个 脚本块 ),在这种情况下恰好导致 {} 只是被 删除 .
引用可以防止这种情况。

或者,您可以`-转义不带引号的元字符单独 :
bcdedit /set `{340E0E1A-01EC-4A33-A850-8D6A09FD4CE9`} description "OS2"

一个 通用替代方案,自 PSv3 起可用,是 使用所谓的 stop-parsing symbol, --%,它传递所有剩余的按原样进行参数,无需 PowerShell 解释(扩展 %...% 封闭的环境变量引用除外):

bcdedit --% /set {340E0E1A-01EC-4A33-A850-8D6A09FD4CE9} description "OS2"

警告:如果您的所有参数都是 文字 ,而 --% 会按预期工作,就像您的情况一样, 通常它会阻止您使用 PowerShell 变量 表达式 作为 / 在参数 中,并且可以有其他 意外的副作用 - 参见


可选背景信息

除非需要插值 PowerShell 变量和表达式,--% 允许按原样重用 cmd.exe 命令行,而不必担心 PowerShell 的引用(转义)要求.

通常,PowerShell 的元字符(不加引号时具有特殊含义的字符)cmd.exe 的不同,数量更多:

cmd.exe 的元字符中。,

& | < >

PowerShell 具有:

( ) , { } ; @ $ # 

<>@# 仅在 start 处具有特殊含义一个令牌。
< 保留供 将来 使用,自 PowerShell 7.0

除此之外,关于变量展开(插值)

  • cmd.exe 仅扩展 %...%-封闭的 变量名(例如,%PATH%),而 PowerShell 需要 $-前缀 变量名(例如 $env:PATH$HOME)或 $(...)-封闭表达式(子表达式运算符)

    • 在两个解释器中,变量扩展(在 PowerShell 中,还有子表达式扩展)也在 "..."(双引号字符串)中执行。
  • '...'(单引号字符串)在 PowerShell 中是 文字 字符串(内容按原样使用,没有插值),而 'cmd.exe 没有任何特殊意义。

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

  • 将它们包含在 引号字符串中:

    • cmd.exe 和 PowerShell:将它们包含在 "..." 中(但可能对也包含在字符串中的任何变量引用/子表达式进行插值);例如,"|".
    • 仅限 PowerShell:将它们包含在 '...' 中;例如,'|'
  • 逃避他们个别:

    • PowerShell:`-转义它们(反引号);例如,`|
      • 这在 "..." 中也有效,尽管只需要 转义 $ 以防止变量/子表达式扩展。
    • cmd.exe^-转义它们(插入符号);例如,^|
      • 这仅适用于 "..." 之外,遗憾的是,它不适用于转义 % 以抑制变量扩展 - 请参阅 this answer 完整故事。