WinPEは通常RAMディスクという方式をとる。これは物理メモリ上の領域に、boot.wimの容量が200MBであれば200MBを確保し、そのままそっくりデータをロードさせる方式だ。この方式の利点は、一旦メモリ上にデータを載せてしまえばそのあとは高速で処理できるし、起動媒体(CDやUSBメモリなど)を取り外すことができることだ。たとえばUSB端子が1ヶ所しかなく、USBメモリで起動させた後、USBメモリを抜いてバックアップ保存用に別のUSB外付けHDDに差し換えるというようなことも可能になる。
一方この方法の欠点は、一旦プログラムによって占拠されたメモリ領域はそのほかの用途には利用できないので、残りのメモリ領域で作業を支えることになる。最近はメモリが安いので2GB以上のメモリを搭載しているPCも当たり前になったが、一時代前のものでは256MB以下のメモリのものも多いので、それらのPCでは最初から起動しなかったり、コピー操作で止まってしまったりする可能性が出てくる。WinPEで起動させるPCの要件は搭載メモリが最低512MB以上、できれば1GBは欲しいと言われるのはそこに理由がある。
今回このページで紹介する方法は、RAMディスクを利用しない方法だ。通常のCDブートのプログラムと同様に、必要があればその都度媒体からデータを読み込む方式なので、最初に一度に大量のメモリ領域を占拠するようなことはしない。しかし途中で媒体を抜いてしまうようなことはできない。
第5章でダウンロードしてもらったファイルの中で、使っていないバッチファイルがあった。WinPE2_CD.CMDあるいはDISM_CD.CMDのことである。このバッチファイルを使う。
第5章と同じく、バッチファイルを、空白や日本語文字のない階層に置いて、WinPE専用コマンドプロンプトから呼び出す。たとえば、C:\test\に置いたとすると、WinPE2の場合には
C:\test\WinPE2_CD.CMD
WinPE3の場合には
C:\test\DISM_CD.CMD
を実行する。これだけである。
WinPE2_CDの詳しい解説はこちらを参照。
DISM_CDの詳しい解説はこちらを参照。
要するに、wimファイルを展開して、mountフォルダの中身をそのまま、wimに纏め直すことなく、CD-Rに書き出しただけである。ただしISOフォルダ下にあるbootmgrとbootフォルダは起動に必要なので、mountフォルダにコピーしてやる必要がある。またbootフォルダにあるbcdはbootmgrの設定ファイルであるが、これをそのまま使うと起動しないので、新しく作り直してやっている。
バッチファイルの中身は、別ページの解説を読んでもらえれば大体分かると思うが、for /fで始まる1行だけが分かりにくいと思うので説明しておく。
for /f "tokens=数字 delims=文字" %%変数 in ('コマンド文')
という形式になっている。delimsは区切り文字である。たとえば,を区切り文字にしたければdelims=, と書く。
今日は,天気が良いので,公園まで,散歩しました。
という文章ならば
今日は |
天気が良いので |
公園まで |
散歩しました。 |
というように、区切り文字のところで、4つに分割できると考えるわけだ。
区切り文字は、句読点のようなものに限らず何でも良い。空白やタブ文字が標準ではあるものの、常識にこだわる必要は無い。例えばひらがなの は を区切り文字に指定すると
吾輩は猫である。名前はまだ無い。
という文章は
吾輩 |
猫である。名前 |
まだ無い。 |
と3つに分割できる。句読点で分割するという既成概念にとらわれず、純粋に記号的に考えればよいのだ。
それから tokens= は区切った部分の何番目を使うかという指定だ。tokens=2 ならば2番目のグループを使えという意味だ。上の例なら
猫である。名前
というグループになる。
さて in ('コマンド文') だが、これはコマンドを実行した後に帰ってくる文章を示している。今回のWinPE2_CD.CMDの場合は、
Bcdedit /store %WinPEDir%\mount\boot\BCD -create /d "WINPE" -application osloader
というコマンドを指定してある。このコマンドを実行すると、帰ってくる文章は
エントリ {a76e1700-67af-11de-9578-0003ff79a66a} は正常に作成されました。
というようになる。今回の例文のように tokens=2 delims={} と指定すると、区切り文字が { あるいは } で、2番目のグループになるから、
a76e1700-67af-11de-9578-0003ff79a66a
が拾い出せるというわけだ。これを変数%iに収めているわけである。(バッチファイルなので%%iと書く)
do set BCDGUID={%%i}
で、%iを再び{}で囲って、BCDGUIDという変数に代入している。これを、それ以降のコマンドで利用しているわけだ。