无法在 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 完整故事。
为什么我不能在 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 中,还有子表达式扩展)也在
'...'
(单引号字符串)在 PowerShell 中是 文字 字符串(内容按原样使用,没有插值),而'
对cmd.exe
没有任何特殊意义。
要将元字符视为文字,您有两个选择:
将它们包含在 引号字符串中:
cmd.exe
和 PowerShell:将它们包含在"..."
中(但可能对也包含在字符串中的任何变量引用/子表达式进行插值);例如,"|"
.- 仅限 PowerShell:将它们包含在
'...'
中;例如,'|'
逃避他们个别:
- PowerShell:
`
-转义它们(反引号);例如,`|
- 这在
"..."
中也有效,尽管只需要 转义$
以防止变量/子表达式扩展。
- 这在
cmd.exe
:^
-转义它们(插入符号);例如,^|
- 这仅适用于
"..."
的 之外,遗憾的是,它不适用于转义%
以抑制变量扩展 - 请参阅 this answer 完整故事。
- 这仅适用于
- PowerShell: