我正在尝试使用 VBScript 以编程方式创建 Windows 7 BCD 存储。构建存储本身、BootMgr 和 OS Loader 似乎很顺利,就像为每个对象填充大部分元素一样。我遇到麻烦的地方是填充 device 和 osdevice 元素。这是有效的代码:
Const BootMgrId = "{9dea862c-5cdd-4e70-acc1-f32b344d4795}"
BootLdrId = Left(CreateObject("Scriptlet.TypeLib").Guid,38)
Set objStoreClass = GetObject("winmgmts:{(Backup,Restore)}\\.\root\wmi:BcdStore")
objStoreClass.CreateStore "m:\boot\BCD", objStore
objStore.CreateObject BootMgrId, &h10200002, objBootMgr
objStore.CreateObject BootLdrId, &h10200003, objBootLdr
objBootLdr.SetStringElement &h12000002, "\windows\system32\boot\winload.exe"
objBootLdr.SetStringElement &h12000004, "DiskWipe"
objBootLdr.SetStringElement &h22000002, "\windows"
objBootLdr.SetBooleanElement &h26000022, True
我遇到问题的代码是:
objBootMgr.SetPartitionDeviceElement &h11000001, 2, "", "m:"
objBootLdr.SetPartitionDeviceElement &h11000001, 2, "", "m:"
objBootLdr.SetPartitionDeviceElement &h21000001, 2, "", "m:"
我在语句末尾尝试了分区路径的几种变体,包括从 win32_Volume 报告的分区的 DeviceId、旧的 boot.ini 样式 ARC 路径、“partition=”和其他似乎有效的语法在 bcd 编辑器中。
一些笔记。最终目标是在同一个物理磁盘上使用另一个分区。我不相信 SetPartitionDeviceElement 是正确的使用方法(它似乎完全是为了 vhds 的利益)。相反,如果我使用:
objBootMgr.SetDeviceElement &h11000001, 1, ""
objBootLdr.SetDeviceElement &h11000001, 1, ""
objBootLdr.SetDeviceElement &h21000001, 1, ""
device 和 osdevice 元素似乎正确填充并反映了当前的启动分区,但是当我将活动分区更改为这个新 BCD 所在的分区并重新启动时,幸运的是没有错误,但它不会启动。这并不奇怪,因为这种方法不允许指定特定分区。我可以使用bcdedit使其工作
bcdedit -store m:\boot\bcd -set {bootmgr} device partition=m:
和
bcdedit -store m:\boot\bcd -set %guid% osdevice partition=m:
bcdedit -store m:\boot\bcd -set %guid% device partition=m:
其中%guid%是 OS Loader 的 GUID。
这方面的有用信息非常少。我对 BCD WMI Provider的MSDN 页面和 BCD 上的旧 MS word 文档非常了解。我还发现 Visual BCD 编辑器在整理对象和元素类型方面很有用,但我真的坚持这个。任何人?