移除 BCD 与 NVRAM 中重复的固件对象

在有些使用统一可扩展固件接口 (UEFI) 的计算机上,固件会在计算机开机时为本机装置 (如 CD-ROM 或硬盘) 建立静态随机存取内存 (NVRAM) 项目。Bcdedit 会同步处理 NVRAM 中的固件命名空间对象与系统开机设定数据 (BCD)。Bcdedit 会在您执行 bcdedit /set 或 /enum 命令时,开启系统 BCD 存放区。bcdedit 开启 BCD 时,会比较 NVRAM 中的项目与 BCD 中的项目。固件在 NVRAM 中建立的项目若未存在于 BCD 中,即会新增至系统 BCD。当 bcdedit 关闭系统 BCD 时,BCD 中任何不在 NVRAM 内的开机管理程序项目皆会新增至 NVRAM 中。bcdedit
/import 命令会将系统 BCD 中的所有固件命名空间对象复制到 NVRAM 中。

若您执行多项 bcdedit /import 操作,NVRAM 即可能包含系统上之装置 (如 CD ROM 与硬盘) 的多个项目。多项 /import 操作可能会导致许多重复项目。下列命令可用以列举 BCD 中的固件命名空间对象:

Bcdedit /enum firmware

下列范例类似于 bcdedit /enum 固件命令所产生的输出:

固件开机管理程序

---------------------

identifier              {fwbootmgr}

displayorder            {bootmgr}

{93cee840-f524-11db-af62-aa767141e6b3}

{93cee841-f524-11db-af62-aa767141e6b3}

{93cee842-f524-11db-af62-aa767141e6b3}

{93cee844-f524-11db-af62-aa767141e6b3}

{93cee843-f524-11db-af62-aa767141e6b3}

timeout                 2

 

Windows 开机管理程序

--------------------

identifier              {bootmgr}

device 
                partition=\Device\HarddiskVolume1

path                   
\EFI\Microsoft\Boot\bootmgfw.efi

description             Windows Boot Manager

locale                  en-US

inherit                 {globalsettings}

default                 {current}

displayorder            {current}

toolsdisplayorder       {memdiag}

timeout                 30

 

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee840-f524-11db-af62-aa767141e6b3}

description             Primary Master CDROM

 

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee841-f524-11db-af62-aa767141e6b3}

description             Harddisk 4

 

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee842-f524-11db-af62-aa767141e6b3}

description             Internal EFI Shell

 

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee843-f524-11db-af62-aa767141e6b3}

description             Floppy

 

固件应用程序 (101fffff)

-------------------------------

identifier 
            {93cee844-f524-11db-af62-aa767141e6b3}

description             Acpi(PNP0A03,0)/Pci(1F|1)/Ata(Primary,Master)/CDROM(Entry1)

若您重复使用 bcdedit /import,NVRAM 与系统 BCD 中即可能会有多个固件对象。若您将主计算机中的 BCD 存放区汇入到目标计算机,则相同的装置可能会有多个固件项目。若有多个固件项目存在,您所看见的 bcdedit /enum 固件输出将包含类似下列范例所示的固件项目:

固件开机管理程序

---------------------

identifier              {fwbootmgr}

displayorder            {bootmgr}

{93cee840-f524-11db-af62-aa767141e6b3}

{93cee841-f524-11db-af62-aa767141e6b3}

{93cee842-f524-11db-af62-aa767141e6b3}

{93cee844-f524-11db-af62-aa767141e6b3}

{93cee843-f524-11db-af62-aa767141e6b3}

{8b87c5a0-f2f2-11db-9717-f87ee6ea6002}

{8b87c5a1-f2f2-11db-9717-f87ee6ea6002}

{8b87c5a2-f2f2-11db-9717-f87ee6ea6002}

{8b87c5a3-f2f2-11db-9717-f87ee6ea6002}

{8b87c5a4-f2f2-11db-9717-f87ee6ea6002}

timeout                 2

每个装置可能会有两个或更多具有不同 GUID 的项目。例如,主服务器 CDROM 可能包含多个项目:

固件应用程序 (101fffff)

-------------------------------

identifier             
{93cee840-f524-11db-af62-aa767141e6b3}

description             Primary Master CDROM

 

固件应用程序 (101fffff)

-------------------------------

identifier              {8b87c5a0-f2f2-11db-9717-f87ee6ea6002}

description             Primary Master CDROM

您可以使用多个 Bcdedit 命令,将 NVRAM 与 BCD 系统存放区中的多个或重复项目移除。若要对您想要移除的多个对象项目使用正确的对象 GUID,则可能必须手动建立命令脚本。

移除重复项目

1.      
使用下列 Bcdedit 命令为目前的系统存放区储存复本。

Bcdedit /export savebcd

您也可以于日后使用此档案进行复原。

2.      
复制要用于 Bcdedit 删除操作的 SaveBCD 档案。

Copy savebcd newbcd

3.      
列举系统 BCD 存放区中的固件命名空间对象,并将输出结果储存到文本文件中:

Bcdedit /enum firmware > enumfw.txt

4.      
使用 Notepad.exe 开启 Enumfw.txt,检视要删除之重复 GUID 项目的列表。检视计算机上的 GUID 项目列表。

5.      
使用 [记事本] 建立新的命令档案。将档案储存为 RemoveDups.cmd。

6.      
在 RemoveDups.cmd 档案中新增命令行,以删除依照 [固件开机管理程序] 显示顺序列出的重复固件 GUID:

Bcdedit /store newbcd /delete
{93cee840-f524-11db-af62-aa767141e6b3}

对每个要移除的 GUID 重复此命令。就上面的范例而言,在 RemoveDups.cmd 中加入下列命令:

Bcdedit /store newbcd /delete
{93cee841-f524-11db-af62-aa767141e6b3}

Bcdedit /store newbcd /delete
{93cee842-f524-11db-af62-aa767141e6b3}

Bcdedit /store newbcd /delete
{93cee843-f524-11db-af62-aa767141e6b3}

Bcdedit /store newbcd /delete
{93cee844-f524-11db-af62-aa767141e6b3}

Bcdedit /store newbcd /delete
{8b87c5a1-f2f2-11db-9717-f87ee6ea6002}

Bcdedit /store newbcd /delete {8b87c5a2-f2f2-11db-9717-f87ee6ea6002}

Bcdedit /store newbcd /delete
{8b87c5a3-f2f2-11db-9717-f87ee6ea6002}

Bcdedit /store newbcd /delete
{8b87c5a4-f2f2-11db-9717-f87ee6ea6002}

在 EFI 固件已初始化其本机装置之 NVRAM 项目标计算机上,您即可在必要时删除所有 GUID 项目。请不要删除 {bootmgr} 的项目

7.      
使用 /clean 选项在汇入操作的过程中移除所有 NVRAM 项目,并将最终命令新增至 RemoveDups.cmd,以汇入新的 BCD 档案:

Bcdedit /import newbcd /clean

8.      
储存档案,并于命令提示字符中执行 RemoveDups.cmd,即可移除 newbcd 存放区中所有的重复项目,并将 newbcd 存放区汇入系统 BCD 中。

9.      
重新开启系统。在重新启动期间,EFI 固件会重新初始化固件对象 GUID 对应于系统连接装置的 NVRAM。使用 bcdedit /enum 固件命令,确认所有重复的固件项目均已移除。