VBScript を使用してプログラムで Windows 7 BCD ストアを作成しようとしています。ストア自体、BootMgr、および OS ローダーの構築は、各オブジェクトのほとんどの要素を設定するのと同様に、順調に進んでいるようです。問題が発生するのは、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=」、および動作するように思われるその他の構文を含めるために、ステートメントの最後にパーティション パスのいくつかのバリエーションを試しました。 bcdeditで。
いくつかのメモ。最終的な目標は、同じ物理ディスク上の別のパーティションを使用することです。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 ローダーの GUID です。
これに関する有用な情報は、地面ではかなり薄いです。私は、BCD WMI プロバイダーのMSDN ページと、BCD の古い MS ワード ドキュメントに首を突っ込んできました。また、Visual BCD エディターがオブジェクトと要素の種類を分類するのに役立つこともわかりましたが、これには本当に行き詰まっています。誰?