![BCD:使用 {ramdiskoptions} 子句命名多个 WinPE](https://linux22.com/image/1497600/BCD%EF%BC%9A%E4%BD%BF%E7%94%A8%20%7Bramdiskoptions%7D%20%E5%AD%90%E5%8F%A5%E5%91%BD%E5%90%8D%E5%A4%9A%E4%B8%AA%20WinPE.png)
我想要一个包含多个 WinPE 版本的 BCD 启动菜单,并显示它们的描述。我制作了一个拇指驱动器,后来是 PXE,它支持启动到多个 WinPE 环境 - 从版本 3.1 到 10、x64 和 x32。问题是,在创建 BCD 存储以启动到 PE 时,您必须使用 {ramdiskoptions} 子句。在这种情况下,在启动时,菜单不会显示每个条目的“描述” - 它仅显示来自 {ramdiskoptions} 条目的描述,所以我最终得到了多个名为“Ramdisk Options”的选项。我将演示我是如何做到这一点的(假设%STR%
是 BCD 存储的完整路径,%GUID% 在下面的示例中进行解释):
1) bcdedit /createstore %STR%
2) bcdedit /store %STR% /create {ramdiskoptions} /d "Ramdisk Options"
3) bcdedit /store %STR% /set {ramdiskoptions} ramdisksdidevice Boot
4) bcdedit /store %STR% /set {ramdiskoptions} ramdisksdipath \Boot\boot.sdi
5) bcdedit /store %STR% /create /d "WinPE x86 3.1" /application osloader
6) bcdedit /store %STR% /set %GUID% systemroot \Windows
7) bcdedit /store %STR% /set %GUID% detecthal Yes
8) bcdedit /store %STR% /set %GUID% winpe Yes
9) bcdedit /store %STR% /set %GUID% osdevice ramdisk=[boot]\Boot\winpex86-31.wim,{ramdiskoptions}
10) bcdedit /store %STR% /set %GUID% device ramdisk=[boot]\Boot\winpex86-31.wim,{ramdiskoptions}
11) (repeat lines 5 to 10 as needed)
12) bcdedit /store %STR% /create {bootmgr} /d "Windows Boot Manager"
13) bcdedit /store %STR% /set {bootmgr} displayorder %GUID% ........
因此,我针对 WinPE v5 x86、v3.1 x64、v5 x64 和 v10 重复第 5 行至第 10 行。每次我在第 5 行设置新描述,获取新 %GUID%,在第 9 行和第 10 行设置适当的图像,最后我对刚刚创建的每个 %GUID% 执行 displayorder。然后我启动驱动器,它显示:
Ramdisk Options
Ramdisk Options
Ramdisk Options
Ramdisk Options
Ramdisk Options
我希望它显示每个条目的描述,例如WinPE x86 3.1
。请告诉我我可能做错了什么。我也尝试使用 easy-bcd 修改条目,但没有成功。
编辑
再摆弄几下,我创建了另一个存储,并在其中仅创建了 {ramdiskoptions}。我发出了两个命令,以下是它们的输出(仅显示 ID 和类型):
d:\!@>bcdedit /store %str% /enum all /V
Setup Ramdisk Options
---------------------
identifier {ae5534e0-a924-466c-b836-758539a3ee3a}
d:\!@>bcdedit /store %str% /enum all
Setup Ramdisk Options
---------------------
identifier {ramdiskoptions}
所以我认为,这一切都归结为创建另一个“设置 Ramdisk 选项”类型的条目,但我在 bcdeditor 的帮助中找不到正确的命令。顺便说一句,Visual BCD 会随机产生有关外部程序修改存储的错误,并且毫无用处。
答案1
看到这个文章基本上,您可以定义多个 ramdisk 设备,而不必在一个 ramdisk 设备下有多个条目。
尽管只能创建一个 {ramdiskoptions} 对象,但可以使用以下解决方法使用与 {ramdiskoptions} ramdisksdipath 中指定的 .sdi 文件不同的文件。目前我还没有发现实现这一点的任何实际用途,但是,正如 cdob 指出的那样,将来可能有必要这样做。
bcdedit.exe /store C:\Boot\BCD /create /device
运行第一个命令将返回一个全局唯一标识符 (GUID) 值 - 例如 {e05b4c23-618a-11df-89c6-001d925a73cf}。在所有后续命令中,将 {ramdisk_guid} 替换为此值 -
bcdedit.exe /store C:\Boot\BCD /set {ramdisk_guid} ramdisksdidevice partition=C:
bcdedit.exe /store C:\Boot\BCD /set {ramdisk_guid} ramdisksdipath \Boot\different.sdi
现在使用它来启动 WinPE -
bcdedit.exe /store C:\Boot\BCD /create /application osloader
运行此命令将返回全局唯一标识符 (GUID) 值 - 例如 {bdaf610c-622d-11df-a7ee-a711d7fae90e}。在所有后续命令中,将 {guid} 替换为此值,并将 {ramdisk_guid} 替换为通过在步骤 1 中运行命令创建的 GUID -
bcdedit.exe /store C:\Boot\BCD /set {guid} detecthal Yes bcdedit.exe /store C:\Boot\BCD /set {guid} winpe Yes bcdedit.exe /store C:\Boot\BCD /set {guid} osdevice ramdisk=[C:]\Sources\boot.wim,{ramdisk_guid} bcdedit.exe /store C:\Boot\BCD /set {guid} device ramdisk=[C:]\Sources\boot.wim,{ramdisk_guid} bcdedit.exe /store C:\Boot\BCD /set {guid} description "Windows PE" bcdedit.exe /store C:\Boot\BCD /displayorder {guid} /addlast
答案2
Windows BCD 存储中的每个对象都有一个 GUID,可用于在适当的情况下链接该对象。
您可以使用可视化 BCD 编辑器为每个 wim 加载程序创建单独的设备选项对象。根据需要命名这些对象中的描述元素。
然后根据需要为每个加载器替换每个应用程序设备和操作系统设备元素中相应的 GUID。
{ramdiskoptions} 只是一个具有预定义固定 GUID 的设备选项对象。
另请参阅 BCD 中对象如何链接的解释Windows 7 VHD 启动。
答案3
由于存在错误,如果已设置 {ramdiskoptions} 描述,则任何后续基于 WinPE 的对象都不会显示其自己的描述。
所以
2) bcdedit /store %STR% /create {ramdiskoptions} /d "Ramdisk Options"
应改为
2) bcdedit /store %STR% /create {ramdiskoptions}
这个小技巧完美地修复了我的所有基于 Win8/Win10 直到最新的 Win10 2004 版的 PE 的启动管理器项全部显示为“Ramdisk 选项”的问题。
这是一个示例脚本。
rem Creates BCD (boot configuration data) for three Windows PE 2.0 images or later
rem This script must be running in windows 7/8/10 and run as administrator
rem Or you can run it in the PE 2.or later environment
rem
Rem This script based on the Win10 Installation USB drive
Rem Put you PE wim file inside the \boot folder
Rem Put this script inside the \boot folder
Rem Modifi this script, change the description and the wim file name the match you wim file
Rem At last, run this script to generate BCD file.
Rem ** If you want to change the Boot menut of the UEFI boot, copy the new BCD file to \efi\microsoft\boot\ folder
set BCD-File=.\BCD
del %BCD-File%.bak
ren %BCD-File% bcd.bak
pause
Bcdedit -createstore %BCD-File%
Bcdedit -store %BCD-File% -create {ramdiskoptions}
Bcdedit -store %BCD-File% -set {ramdiskoptions} ramdisksdidevice boot
Bcdedit -store %BCD-File% -set {ramdiskoptions} ramdisksdipath \boot\boot.sdi
for /f "tokens=1-3" %%a in ('Bcdedit -store %BCD-File% -create /d "1. Win8PEx64 XiaoBai" /application osloader') do set guid4=%%c
Bcdedit -store %BCD-File% -set %guid4% systemroot \Windows
Bcdedit -store %BCD-File% -set %guid4% detecthal Yes
Bcdedit -store %BCD-File% -set %guid4% winpe Yes
Bcdedit -store %BCD-File% -set %guid4% osdevice ramdisk=[boot]\Boot\xiaobaiNT63PEX64.WIM,{ramdiskoptions}
Bcdedit -store %BCD-File% -set %guid4% device ramdisk=[boot]\Boot\xiaobaiNT63PEX64.WIM,{ramdiskoptions}
for /f "tokens=1-3" %%a in ('Bcdedit -store %BCD-File% -create /d "2. Windows 10 x64 Installation" /application osloader') do set guid6=%%c
Bcdedit -store %BCD-File% -set %guid6% device ramdisk=[boot]\sources\boot.WIM,{ramdiskoptions}
Bcdedit -store %BCD-File% -set %guid6% path \windows\system32\boot\winload.exe
Bcdedit -store %BCD-File% -set %guid6% osdevice ramdisk=[boot]\sources\boot.WIM,{ramdiskoptions}
Bcdedit -store %BCD-File% -set %guid6% systemroot \Windows
Bcdedit -store %BCD-File% -set %guid6% detecthal Yes
Bcdedit -store %BCD-File% -set %guid6% winpe Yes
Bcdedit -store %BCD-File% -create {bootmgr} /d "Windows PE Boot Manager"
Bcdedit -store %BCD-File% -set {bootmgr} timeout 10
Bcdedit -store %BCD-File% -set {bootmgr} displayorder %guid4% %guid6%
Bcdedit -store %BCD-File% /enum all