无忧启动论坛

标题: BcdEdit使用指南 [打印本页]

作者: 2011htpcfans    时间: 2013-12-10 10:36
标题: BcdEdit使用指南
本帖最后由 2011htpcfans 于 2014-4-26 09:29 编辑

在另外一贴中http://bbs.wuyou.net/forum.php?m ... d=320636&extra=功能15、16也是BcdEdit应用的一点示例,里面实际上有一些问题,不过还是可以参考一下的。

资料大部分是搜集整理而来,也有自己的一点体会。
1、BCDEdit基础
使用BCDEdit创建修改Windows8/7的系统启动菜单
(1)最好先建立一点感性认识,非常细致透彻的掌握需要你在这篇文章外继续坚持。
在之前基于NT的Windows系统中,Windows使用Ntldr作为Boot Loader来启动系统,
——所谓boot loader,在指在内核运行之前执行的一段小程序,系统通过它来初始化硬件设备、建立内存空间的映射图等,将系统的软硬件环境设置成一个合适的状态,为最终调用操作系统内核准备好正确的环境。——在启动过程中,Ntldr 使用Boot.ini 文件来确定在启动/引导过程中要显示哪些操作系统选项,我们对启动选项的设置可以通过修改boot.ini文件中相应内容实现。在Windows 8/7中,微软引入了一种全新的boot loader架构, Windows Boot Manager (Bootmgr.exe)。与Ntldr严重地依赖于硬件不同的是,Windows 8/7中的新架构可以实现完整的硬件独立性,且能够与多种操作系统无缝结合,让Windows 8/7的启动/引导过程更加快速与安全。同时,将之前Windows 系统中由Boot.ini管理的内容移交给新的Boot Configuration Data (BCD : 启动设置数据),当然,也提供了新的启动选项编辑工具,BCDEdit (BCDEdit.exe),来管理启动设置。
在传统的基于BIOS的计算机中,如果只安装Windows Vista,除了极早期的Windows Vista测试版本外,您将会发现 Boot.ini 文件已经彻底从系统中消失;如果系统中安装了Windows Vista和之前的WIndows系统如Windows XP,虽然仍可找到 Boot.ini 文件,不过,这个文件只作用于那些系统,而不会对 Windows Vista的启动有任何影响。
在基于EFI (Extensible Firmware Interface : 可扩展固件接口,以后采用这种接口的PC会越来越多 )的计算机中,Boot.ini 文件则更不复存在,在基于EFI的系统中,启动选项被贮存在主板的存储器中。此时要修改启动选项,要么通过能够读写NVRAM的工具如NvrBoot,要么使用上文提到的BCDEdit。
由此可见,在Windows 8/7中,想要再像之前Windows XP中那样通过一个简单的文本编辑器来修改Boot.ini的方式来管理启动选项已经不可能了,要对启动设置进行修改,只能使用命令格式相对要复杂得多的BCDEdit。
此外,微软也在Windows 8/7 中提供了可通过WMI (Windows Management Instrumentation : Windows管理规范)调用的 BCD 类,通过它可以用编程的方式修改BCD数据,不过,相信对绝大多数用户而言,这更是不可能的任务。
启动BCDEdit
需要注意的是,BCDEdit不是一个运行于图形界面下的程序,而是一个命令行工具,该文件 (Bcdedit.exe) 位于 “\Windows\System32”目录下。
要执行BCDEdit,首先应进入命令行窗口,并要将操作用户并提升至管理员权限。
在命令行窗口中,转到系统目录如 “C:/windows/system32”下,然后输入“ bcdedit” 即可。
BCDEdit命令简介
  通过命令行工具Bcdedit,我们可以添加、删除及修改BCD (Boot Configuration Data)中的对象。在BCD中,每个对象均具有唯一的 GUID (Globally Unique Identifier : 全局唯一标识符),如系统中的每块硬盘、每个分区的GUID (全局唯一标识符)均不相同。
在BCD中,硬盘或分区的GUID可分为如下几类:
{ntldr}:指存在上一代Windows系统如Windows XP的硬盘或分区;
{default}: 默认所在硬盘或分区;操作系统
{current}: 当前硬盘或分区;
{bootmgr} Windows启动管理器,这个一般不用管,会自动生成
{memdiag} Windows内存诊断
  (注:这只是个例子,具体数字根据硬盘或分区参数会有相应变化,但均会类似于格式)。
BCDEDIT命令
bcdedit /? : 显示命令帮助
bcdedit.exe /? CREATESTORE : 显示命令参数“ CREATESTORE ”的详细信息,——当然,“ CREATESTORE ”也只是示例,使用中对其他任何可用参数也均可使用类似格式查看该参数的具体说明。
使用BCDEdit备份与恢复启动选项
作为一种良好的操作习惯,在对Windows 8/7的启动选项修改之前,最好先对其备份,以防万一操作失误或其他故障导致系统无法启动。
bcdedit /export “D:\BCD Backup\Bcd Backup” : 将启动设置备份到D盘 “BCD Backup” 目录下;
bcdedit /import “D:\BCD Backup\Bcd Backup” : 恢复之前备份在D盘 “BCD Backup”目录下启动选项。
bcdedit 或 bcdedit /enum all : 显示Windows Vista系统当前的启动设置数据,这时系统中所有安装了操作系统的硬盘或分区均会显示相应的 GUID 标识。BCDEdit只是一款命令行工具,我们操作时需手动输入类似“”这样的长字符串时,很容易出错,而这往往会导致Windows 8/7启动失败。其实更好的显示GUID 标识的方法是把信息导出到一个指定位置的文件中去,从文件中找GUID 标识符简单多了,如下所示:
::显示所有菜单项,或者我们想在命令提示符中简单看下
bcdedit /enum all
::不显示菜单项,但内容都在d:\fguid.txt中,位置大家可以自己指定。这也为后期编程处理提供了素材,如果你愿意。
bcdedit /enum all>d:\fguid.txt
::下面是我的电脑的d:\fguid.txt内容,有点乱,像天书一般,大家开始时就培养个感性认识,别较真,我也是搞了好久才入门,只要坚持总有吃透的一天。

固件启动管理器
---------------------
标识符                  {fwbootmgr}
displayorder            {bootmgr}
                        {ab48eca6-5cfc-11e3-bed0-bec402b75003}
                        {64f5839c-600c-11e3-829e-bc5ff4bc4378}
                        {64f5839b-600c-11e3-829e-bc5ff4bc4378}
timeout                 2

Windows 启动管理器
--------------------
标识符                  {bootmgr}
device                  partition=\Device\HarddiskVolume3
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  en-us
inherit                 {globalsettings}
integrityservices       Enable
default                 {default}
resumeobject            {ab48ecaf-5cfc-11e3-bed0-bec402b75003}
displayorder            {default}
                        {current}
                        {43ae30af-600b-11e3-829e-bc5ff4bc4378}
                        {64f5839e-600c-11e3-829e-bc5ff4bc4378}
                        {64f583a2-600c-11e3-829e-bc5ff4bc4378}
toolsdisplayorder       {memdiag}
timeout                 1

固件应用程序(101fffff)
-------------------------------
标识符                  {64f5839b-600c-11e3-829e-bc5ff4bc4378}
description             Hard Drive

固件应用程序(101fffff)
-------------------------------
标识符                  {64f5839c-600c-11e3-829e-bc5ff4bc4378}
device                  partition=E:
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager

固件应用程序(101fffff)
-------------------------------
标识符                  {ab48eca6-5cfc-11e3-bed0-bec402b75003}
description             Hard Drive

Windows 启动加载器
-------------------
标识符                  {43ae30af-600b-11e3-829e-bc5ff4bc4378}
device                  ramdisk=[\Device\HarddiskVolume3]\winpe\boot.wim,{0b66113c-600a-11e3-829e-bc5ff4bc4378}
path                    \windows\system32\winload.efi
description             Win8_PE_x64
osdevice                ramdisk=[\Device\HarddiskVolume3]\winpe\boot.wim,{0b66113c-600a-11e3-829e-bc5ff4bc4378}
systemroot              \windows
nx                      OptIn
detecthal               Yes
winpe                   Yes

Windows 启动加载器
-------------------
标识符                  {64f5839e-600c-11e3-829e-bc5ff4bc4378}
device                  ramdisk=[\Device\HarddiskVolume3]\winpe\boot.wim,{64f5839d-600c-11e3-829e-bc5ff4bc4378}
description             Win81PE_x64
osdevice                ramdisk=[\Device\HarddiskVolume3]\winpe\boot.wim,{64f5839d-600c-11e3-829e-bc5ff4bc4378}
systemroot              \windows
nx                      OptIn
detecthal               Yes
winpe                   Yes

Windows 启动加载器
-------------------
标识符                  {64f583a0-600c-11e3-829e-bc5ff4bc4378}
device                  ramdisk=[\Device\HarddiskVolume3]\winpe\boot.wim,{64f5839f-600c-11e3-829e-bc5ff4bc4378}
description             Win81PE_x64
osdevice                ramdisk=[\Device\HarddiskVolume3]\winpe\boot.wim,{64f5839f-600c-11e3-829e-bc5ff4bc4378}
nx                      OptIn

Windows 启动加载器
-------------------
标识符                  {64f583a2-600c-11e3-829e-bc5ff4bc4378}
device                  ramdisk=[\Device\HarddiskVolume3]\winpe\boot.wim,{64f583a1-600c-11e3-829e-bc5ff4bc4378}
path                    \windows\system32\winload.efi
description             Win81PE_x64
osdevice                ramdisk=[\Device\HarddiskVolume3]\winpe\boot.wim,{64f583a1-600c-11e3-829e-bc5ff4bc4378}
systemroot              \windows
nx                      OptIn
detecthal               Yes
winpe                   Yes

Windows 启动加载器
-------------------
标识符                  {current}
device                  partition=C:
path                    \windows\system32\winload.efi
description             Windows 8
locale                  en-us
inherit                 {bootloadersettings}
integrityservices       Enable
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=C:
systemroot              \windows
resumeobject            {ab48ecad-5cfc-11e3-bed0-bec402b75003}
nx                      OptIn
bootmenupolicy          Standard
detecthal               Yes

Windows 启动加载器
-------------------
标识符                  {default}
device                  partition=D:
path                    \windows\system32\winload.efi
description             Windows 8.1
locale                  en-us
inherit                 {bootloadersettings}
integrityservices       Enable
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
osdevice                partition=D:
systemroot              \windows
resumeobject            {ab48ecaf-5cfc-11e3-bed0-bec402b75003}
nx                      OptIn
bootmenupolicy          Standard
detecthal               Yes

从休眠状态恢复
---------------------
标识符                  {ab48ecad-5cfc-11e3-bed0-bec402b75003}
device                  partition=C:
path                    \windows\system32\winresume.efi
description             Windows Resume Application
locale                  en-us
inherit                 {resumeloadersettings}
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
filedevice              partition=C:
filepath                \hiberfil.sys
bootmenupolicy          Standard
debugoptionenabled      No

从休眠状态恢复
---------------------
标识符                  {ab48ecaf-5cfc-11e3-bed0-bec402b75003}
device                  partition=D:
path                    \windows\system32\winresume.efi
description             Windows Resume Application
locale                  en-us
inherit                 {resumeloadersettings}
isolatedcontext         Yes
allowedinmemorysettings 0x15000075
filedevice              partition=D:
filepath                \hiberfil.sys
bootmenupolicy          Standard
debugoptionenabled      No

Windows 内存测试程序
---------------------
标识符                  {memdiag}
device                  partition=\Device\HarddiskVolume3
path                    \EFI\Microsoft\Boot\memtest.efi
description             Windows Memory Diagnostic
locale                  en-us
inherit                 {globalsettings}
badmemoryaccess         Yes

EMS 设置
------------
标识符                  {emssettings}
bootems                 No

调试器设置
-----------------
标识符                  {dbgsettings}
debugtype               Serial
debugport               1
baudrate                115200

RAM 故障
-----------
标识符                  {badmemory}

全局设置
---------------
标识符                  {globalsettings}
inherit                 {dbgsettings}
                        {emssettings}
                        {badmemory}

启动加载器设置
--------------------
标识符                  {bootloadersettings}
inherit                 {globalsettings}
                        {hypervisorsettings}

虚拟机监控程序设置
-------------------
标识符                  {hypervisorsettings}
hypervisordebugtype     Serial
hypervisordebugport     1
hypervisorbaudrate      115200

恢复加载器设置
----------------------
标识符                  {resumeloadersettings}
inherit                 {globalsettings}

设备选项
--------------
标识符                  {0b66113c-600a-11e3-829e-bc5ff4bc4378}
description             Win8_PE_x64
ramdisksdidevice        partition=\Device\HarddiskVolume3
ramdisksdipath          \winpe\boot.sdi

设备选项
--------------
标识符                  {64f5839d-600c-11e3-829e-bc5ff4bc4378}
description             Win81PE_x64
ramdisksdidevice        partition=\Device\HarddiskVolume3
ramdisksdipath          \winpe\boot.sdi

设备选项
--------------
标识符                  {64f5839f-600c-11e3-829e-bc5ff4bc4378}
description             Win81PE_x64
ramdisksdidevice        partition=\Device\HarddiskVolume3
ramdisksdipath          \winpe\boot.sdi

设备选项
--------------
标识符                  {64f583a1-600c-11e3-829e-bc5ff4bc4378}
description             Win81PE_x64
ramdisksdidevice        partition=\Device\HarddiskVolume3
ramdisksdipath          \winpe\boot.sdi

(2)标识符
每一个bcdedit中的启动项都有一个唯一的标识符,格式类似于Windows的CLSID,如 {791d518d-3526-11de-8dab-b4cd0d61d150}。但有几个特殊的标识符是我们需要记住的。
{default} 默认启动项,我的BCD中,{default}是Windows 8.1 x64
{ntldr} 基于NTLDR启动的系统,如NT4.0、XP、2003
{current} 当前的启动项, 我的BCD中,{ current }是Windows 8 x64 vhd,当前你已经启动到哪个系统,{ current }就是它。
{bootmgr} Windows启动管理器,这个一般不用管,会自动生成
{memdiag} Windows内存诊断
(3)创建和修改启动项目
以下的命令如果要修改自己创建的启动配置文件而不是引导菜单,只要用/store指定文件名即可。如:bcdedit /store "C:\1.bcd" /create {ntldr} /d "XP"创建一个XP的启动项:bcdedit /create {ntldr} /d "XP"
这样做的好处是先做好试验,最后再导入到系统BCD中。
创建一个Vista的启动项:bcdedit /create /d "Vista"   /application osloader
复制启动项:bcdedit /copy 要复制的标识符 /d 描述
/d指定启动菜单里的文字,可以自己起,不要忘了引号。
/application指定启动项的“应用程序类型”,创建非XP类型的启动项时才需要。常用的有两种:osloader(操作系统加载器)和bootsector(启动扇区)。一般来说VISTA都是从某个文件开始启动的,应该指定为“操作系统加载器”类型,如果是要从某个文件里读取启动扇区(如各种版本的LINUX启动文件、XP引导WinMe的bootsect.dos文件等),就应该指定为“启动扇区”类型了。
第二条和第三条命令运行后系统会给出一个新的标识符,请记下,修改时要用到。
删除启动项:bcdedit /delete 标识符。但要注意,删除XP的启动项时,应加上/f参数:bcdedit /delete {ntldr} /f
设置启动项显示顺序:bcdedit /displayorder 标识符。如:
先显示XP再显示VISTA:bcdedit /displayorder {ntldr} {current}
另外,用/addfirst和/addlast可以把启动项加入菜单第一位和最后一位,如 bcdedit /displayorder {ntldr} /addlast
用/toolsdisplayorder可以设定启动菜单里工具的显示顺序。
设置默认启动项:bcdedit /default 标识符。如:bcdedit /default {current} 把当前的VISTA系统设成默认启动。
(4)设置启动项的参数
在启动项列表中,大家可以看到每一项的下面都有很多参数,这些命令就可以设置参数。基本格式如下:
设置参数:bcdedit /set 标识符 参数名 参数值
删除参数:bcdedit /deletevalue 标识符 参数名
如果不指定标识符,则默认为当前系统,即{current}。我们需要掌握的几个参数如下:
device:启动设备,如 bcdedit /set {ntldr} device partition=C:设置XP启动分区为C盘。对于{bootmgr}来说也是C盘,对于VISTA来说只要把C换成VISTA所在分区即可。
osdevice:系统启动设备,只在VISTA启动项里有效,一般设成和device一样。
path:启动文件路径,XP是\ntldr,Vista是\Windows\system32\winload.exe
description:启动菜单里显示的文字。
nx:DEP设置,类似于XP,可设为OptIn、OptOut。
这个,大家也可以列出启动项看一下。
在菜单里选择了要启动的系统后,bootmgr会从device指定的启动设备去寻找path中的启动文件,从而启动对应的操作系统。清楚了这一点,我们配置启动项就不困难了。
(5)基本操作指令
  /createstore 创建一个新的空白启动配置数据文件。
bcdedit /createstore C:\Data\BCD 创建BCD启动配置数据文件储存到“C:\DATA\”文件夹。
  /export 备份启动配置数据文件。
  bcdedit /export "C:\Data\BCD Backup" 备份BCD启动配置文件到“C:\Data\”文件夹,并以“BCD Backup”命名。
  /import 还原启动配置数据文件。
  bcdedit /import "C:\Data\BCD Backup" 从“C:\Data\”文件夹恢复BCD启动配置文件。
  储存项目操作指令
 
  /copy 项目拷贝
  操作系统启动项目的拷贝:
  bcdedit /copy /d "Copy of entry"
  /create 新建项目
  创建操作系统载入程序项目的 NTLDR(Ntldr):
  bcdedit /create /d "Earlier Windows OS Loader"
  创建存储器磁碟另外的选择项项目:
  bcdedit /create /d "Ramdisk options"
  创建一个新的操作系统启动项目:
  bcdedit /create /d "Windows Vista" /application osloader
  创建一个新的调试器:
  bcdedit /create /d "Debugger Settings"
  /delete 删除项目
  删除指定的操作系统项目:
  bcdedit /delete
  删除指定的操作系统项目但启动时不显示项目(彻底删除):
  bcdedit /delete /cleanup
  删除指定的操作系统项目但启动时显示项目:
  bcdedit /delete /nocleanup
  删除操作系统载入程序项目的 NTLDR:
  bcdedit /delete /f
  项目选择操作指令
  ====================
  /deletevalue 删除项目选择项。
  删除启动管理的bootmgr选择项项目:
  bcdedit /deletevalue bootsequence
  删除(WinPE)操作系统的数值开机项目:
bcdedit /deletevalue winpe
  删除来自指定的操作的 Windows PE 数值系统开机项目:
  bcdedit /deletevalue winpe
  /set 设定项目选择项数值。
  设定操作系统“cbd971bf-b7b8-4885-951a-fa03044f5d71”引导分区“C”:
  bcdedit /set device partition=C:
  指定的操作系统引导文件“ windows\ system 32\ winload.exe”:
  bcdedit /set path \windows\system32\winload.exe
  设定“NX”为“OptIn”:
  bcdedit /set nx optin
  更改系统名称
  默认XP系统名称在Vista启动管理器中是"earlier version of Windows",更改:
  bcdedit /set Description "Windows XP Professional SP2"
  默认Vista系统名称在Vista启动管理器中是"Microsoft Windows",更改:
  bcdedit /set Description "Windows Vista 5456"
  输出控制指令
  ====================
  /enum 在储存中的列表项目。
  列出所有的操作系统载入程序启动项目:
  bcdedit /enum OSLOADER
  列出所有的启动管理项目:
  bcdedit /enum BOOTMGR
  列出默认的启动项目:
  bcdedit /enum
  列出指定的操作系统启动项目:
  bcdedit /enum
  /v 列出所有活动的项目
  bcdedit /enum ACTIVE /v
  启动管理控制指令
  ====================
  /bootsequence 设定启动列表顺序。
  设定二个操作系统项目和启动顺序:
  bcdedit /bootsequence {cbd971bf-b7b8-4885-951a- fa03044f5d71}
  加入操作系统项目为启动列表最后项:
  bcdedit /bootsequence /addlast
  /default 设定默认启动项目。
  设定默认启动项目:
  bcdedit /default
  设定默认启动操作系统程序为 NTLDR:
  bcdedit /default
  /displayorder 设定哪一个系统启动显示多启动画面。
  设定二个操作系统项目和在启动管理显示命令中被建立操作系统载入的程序 NTLDR:
  bcdedit /displayorder
  把指定的操作系统项目加入启动管理显示命令结束:
  bcdedit /displayorder /addlast
  /timeout 设定启动暂停数值。
  /toolsdisplayorder 设定命令在哪一个启动管理显示工具画面。
  设定二个工具项目和内存诊断在那启动管理工具显示命令:
  bcdedit /toolsdisplayorder
  把指定的工具项目加入启动的结束管理工具显示命令:
  bcdedit /toolsdisplayorder /addlast
  为一个启动应用程序控制紧急处理服务的指令
  ====================
  /bootems
  开启启动管理紧急处理服务:
  bcdedit /bootems ON
  /ems
  为目前的操作系统启动项目 EMS 开启:
  bcdedit /ems ON
  /emssettings 设定紧急处理服务参数。
  设定 EMS 参数使用基本输出入系统设定:
  bcdedit /emssettings BIOS
在对启动选项的修改过程中,如添加或删除某个硬盘/分区时,可能会因操作中的不慎导致硬盘/分区结构的混乱,除了采用恢复修改前的备份方法外,也可以首先使用BCDEdit来尝试一下修复。
  具体方法如下: 
  X:\>X:\boot\fixntfs.exe -lh -all : 这时的“ X: ”指引导目录 “boot” 所在的硬盘/分区;
bcdedit /set device partition=X: : 将指定GUID的分区设为启动分区。注意,这里的“ X: ”的GUID须与指定值不同,同时,运行该命令后,必须接着运行下面的osdevice命令;
  bcdedit /set osdevice partition=X: : 将指定GUID的分区设为启动分区。注意,这个命令必须与上面的device命令配对使用,同时“ X: ”的GUID须与指定值不同。
  Bcdedit命令详解,自定义Vista启动管理项
  Bcdedit 位于X:\Windows\system32\ "X:"为安装Vista的盘符。

2、Vista MBR BCDEDIT用法实例讲解
操作环境:C盘装xp,D盘装vista,之后c盘的xp又被重装,因此原启动菜单丢失,现在开机只能进xp了。为了方便,我将v:/windows/system32/bcdedit.exe复制到了c:/下,cmd窗口改变当前路径到c:/。预料的bcd信息应该是这样的
Windows Boot Manager
Identifier:             {bootmgr} //这个不是菜单,而是主入口,一个BCD有且只有一个{bootmgr}
Type:                   10100002
Device:                 partition=C: //这个说明BOOT MANAGER的BCD信息在C盘?
Description:            Wolf Boot Manager
Display order:          {ntldr}  //菜单项排列顺序,第一个菜单项
                        {882e394a-f543-11db-8ee8-00105ccdeb8f} //第二个菜单项
Windows Legacy OS Loader
Identifier:             {ntldr}  //XP它用NTLDR这个程序进行引导
Type:                   10300006
Device:                 partition=C: //XP在C盘
Path:                   /ntldr  //引导程序是/ntldr
Description:            Wolf XP  //该菜单显示的文字
Windows Boot Loader
Identifier:             {882e394a-f543-11db-8ee8-00105ccdeb8f} //这串数字是计算机生成的,是唯一的
Type:                   10200003
Device:                 partition=D: //VISTA在D盘
Path:                   /windows/system32/winload.exe //VISTA引导程序是/windows/system32/winload.exe
Description:            Wolf Vista //该菜单显示的文字
Windows device:         partition=D:
Windows root:           /windows
简单讲解,上面只有3个入口(Entry),每个入口又有细分,最关键的是Identifier,很多人看不明白
在BCD中,每个入口的唯一标识就是这个Identifier(简称Id)。
上面有个三个Id:
{bootmgr}
{ntldr}
{882e394a-f543-11db-8ee8-00105ccdeb8f}
我们要修改已经生成的入口,必须指定其Id。修改都是针对具体的Id进行的,后面我们会看到
为什么上面3个Id中,前两个不像最后一个也由一大串数字组成呢?这也是新手最容易误解的原因。
我只能告诉你{bootmgr}和{ntldr}其实是保留的Id,其中{bootmgr}是一个合理的BCD中必须有的ID,{ntldr}这个ID则用来存放XP这一类的老系统的引导菜单信息。
下面我们一步一步来生成上面的bcd信息
由于我们还没有一个文件bcd,因此我们先创建一个,命令如下
bcdedit /createstore bcdwolf
该命令创建一个空的bcd文件c:/bcdwolf;有了这个空bcd文件,我们就对它进行操作
bcdedit /store c:/bcdwolf /create {ntldr} /d Wolf XP"
说明:如果在bcdedit后面不加这个store参数,则是对系统bcd进行操作;加了则是对指定的文件bcd进行操作。
上述命令在c:/bcdwolf文件的BCD信息中创建菜单Wolf XP
/store参数指对c:/bcdwolf进行操作,而不是对系统bcd
/create参数指创建一个新菜单
{ntldr}是固定ID,凡在vista之前的操作系统菜单都用这个Id,如果你需要创建一个能引导XP的菜单项,就一定请用这个ID,不能指定为其他的或者像VISTA菜单那样让计算机为你生成随机ID
/d参数是指定该菜单显示的文字
bcdedit /store c:/bcdwolf /create /d Wolf Vista /application osloader
The entry {882e394a-f543-11db-8ee8-00105ccdeb8f} was successfully created.
创建菜单Wolf Vista
由于是vista系统的菜单,参数改变为/application osloader
Vista和Vista之前的系统,菜单创建方式是不同的
bcdedit /store c:/bcdwolf /create {bootmgr} /d Wolf Boot Manager
The entry {bootmgr} was successfully created.
创建{bootmgr}入口,这个是主入口,不是菜单,建立的所有菜单都在这个入口中管理
bcdedit /store c:/bcdwolf /enum all
显示我们创建的c:/bcdwolf的内容
Windows Boot Manager
Identifier:             {bootmgr}
Type:                   10100002
Description:            Wolf Boot Manager
Windows Boot Loader
Identifier:             {882e394a-f543-11db-8ee8-00105ccdeb8f}
Type:                   10200003
Description:            Wolf Vista
Windows Legacy OS Loader
Identifier:             {ntldr}
Type:                   10300006
Description:            Wolf XP
设置{bootmgr}入口的device值
bcdedit /store c:/bcdwolf /set {bootmgr} device partition=c:
操作成功完成。
设置{ntldr}入口的device值,这里实际是xp所在分区,它在c盘
bcdedit /store c:/bcdwolf /set {ntldr} device partition=c:
操作成功完成。
设置{ntldr}入口的path值,这里指定引导程序所在路径,xp是在c:/ntldr;
bcdedit /store c:/bcdwolf /set {ntldr} path /ntldr
操作成功完成。
设置{882e394a-f543-11db-8ee8-00105ccdeb8f}入口的device值
说明:{882e394a-f543-11db-8ee8-00105ccdeb8f}是菜单“Wolf Vista”的全局Id,这个Id是自动生成的,vista在d盘
Cbcdedit /store c:/bcdwolf /set {882e394a-f543-11db-8ee8-00105ccdeb8f} device partition=d:
操作成功完成。
设置{882e394a-f543-11db-8ee8-00105ccdeb8f}入口的path值,应该在d:/windows/system32/winload.exe
bcdedit /store c:/bcdwolf /set {882e394a-f543-11db-8ee8-00105ccdeb8f} path /windows/system32/winload.exe
操作成功完成。
将id为{ntldr}的菜单追加到多重菜单的最后
bcdedit /store c:/bcdwolf /displayorder {ntldr} /addlast
操作成功完成。
将id为{882e394a-f543-11db-8ee8-00105ccdeb8f}的菜单(即Wolf Vista)追加到多重菜单的最后
bcdedit /store c:/bcdwolf /displayorder {882e394a-f543-11db-8ee8-00105ccdeb8f} /addlast
操作成功完成。
设置{882e394a-f543-11db-8ee8-00105ccdeb8f}的windows device为d盘
bcdedit /store c:/bcdwolf /set {882e394a-f543-11db-8ee8-00105ccdeb8f} osdevice partition=d:
操作成功完成。
设置{882e394a-f543-11db-8ee8-00105ccdeb8f}的windows root为/windows
bcdedit /store bcdwolf /set {882e394a-f543-11db-8ee8-00105ccdeb8f} systemroot /windows
操作成功完成。
查看结果
bcdedit /store bcdwolf
Windows Boot Manager
Identifier:             {bootmgr}
Type:                   10100002
Device:                 partition=C:
Description:            Wolf Boot Manager
Display order:          {ntldr}
                        {882e394a-f543-11db-8ee8-00105ccdeb8f}
Windows Legacy OS Loader
Identifier:             {ntldr}
Type:                   10300006
Device:                 partition=C:
Path:                   /ntldr
Description:            Wolf XP
Windows Boot Loader
Identifier:             {882e394a-f543-11db-8ee8-00105ccdeb8f}
Type:                   10200003
Device:                 partition=D:
Path:                   /windows/system32/winload.exe
Description:            Wolf Vista
Windows device:         partition=D:
Windows root:           /windows
再增加一点内容,设置等待时间为30秒
bcdedit /store bcdwolf /timeout 30
操作成功完成。
将{882e394a-f543-11db-8ee8-00105ccdeb8f}设置为缺省菜单
bcdedit /store bcdwolf /default {882e394a-f543-11db-8ee8-00105ccdeb8f}
操作成功完成。
最后来看看
bcdedit /store bcdwolf
Windows Boot Manager
Identifier:             {bootmgr}
Type:                   10100002
Device:                 partition=C:
Description:            Wolf Boot Manager
Default:                {default}
Display order:          {ntldr}
                        {default}
Timeout:                30
Windows Legacy OS Loader
Identifier:             {ntldr}
Type:                   10300006
Device:                 partition=C:
Path:                   /ntldr
Description:            Wolf XP
Windows Boot Loader
Identifier:             {default}
Type:                   10200003
Device:                 partition=D:
Path:                   /windows/system32/winload.exe
Description:            Wolf Vista
Windows device:         partition=D:
Windows root:           /windows
=======================================
你可以将文件BCD导入系统BCD
bcdedit /import c:/bcdwolf
你也可以备份系统BCD到文件
bcdedit /export e:/bcdbak

========================
整个过程是这样的:
先用/create 创建3个入口
再用/set 设置每个入口下面具体的值,比如device, path等等
最后用/displayorder 将建好的每个入口(菜单项)一个一个加入到引导菜单中
其他还可以用/timeout 设置等待时间
以及用/default 设置缺省菜单
上面操作中的“入口”,实际都是用花括号中的Id来表示的
==================================
设置好系统BCD之后,重启计算机,并不能保证成功进行多重引导。因为BCD要起作用还必须依赖于C:/BOOT文件夹及C:/BOOTMGR这个文件。其中C:/BOOTMGR是真正的开机引导程序,而C:/BOOT文件夹中有一个名为BCD的文件(大家可以用bcdedit /store c:/boot/bcd /enum all查看内容),以及一个FONT子文件夹,里面含有字体文件,估计是用于开机引导菜单的显示。

3、Windows PE安装到本地硬盘
PE作为系统维护工具,一般来说刻录到光盘或者U盘即可,但是对于没有条件的朋友来说,安装到硬盘也未尝不可。下面介绍一下如何将PE3.x安装到本地硬盘。
     再次介绍一下bootmgr引导的过程:开机自检——>MBR——>PBR——>Bootmgr——>BCD——>列出启动菜单——>启动系统或PE。BCD菜单可以添加ramdisk引导,ramdisk就是拓展名为WIM的文件。对于PE3.x来说,加载的是boot.wim映像文件,而boot.wim映像文件的执行需要boot.sdi来支持,因此每个PE3.x里面这两个文件是不可缺少的。
    UEFI启动过程类似,安装过程也差不多了。
准备条件:
1.Windows7 PE(不提供下载)
2.正在使用的是Windows8/7系统。
操作方法:
1.将Windows8/7 PE中的boot.wim(名称可能不一样)、boot.sdi文件提取出来,复制到D盘根目录的winpe文件夹。
2.以管理员身份运行“命令提示符”,接下来就是一些命令的输入,按照惯例:稍作解释、不做赘述。
3.接下来创建菜单:
bcdedit /create /d "Windows 7 PE" /device
——会自动生成一个GUID,假设是{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}。
bcdedit /set {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} ramdisksdidevice partition=d:
——设置boot.sdi所在分区(这里以D盘为例)
bcdedit /set {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} ramdisksdipath \winpe\boot.sdi
——设置boot.sdi的路径
bcdedit /create /d "Windows 7 PE" /application osloader
——添加名称为“Windows 7 PE”的启动项。
——返回另一个GUID,假设为{yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy}。
bcdedit /set {yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy} device ramdisk=[d:]\winpe\boot.wim,{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
——设定启动设备(即:boot.wim文件)
bcdedit /set {yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy} osdevice ramdisk=[d:]\winpe\boot.wim,{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
——设定系统设备(即:boot.wim文件)
bcdedit /set {yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy} path \windows\system32\winload.exe
——设定启动程序(winload.exe)的路径
bcdedit /set {yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy} systemroot \windows
——设定系统的根目录
bcdedit /set {yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy} detecthal yes
——开启detecthal支持
bcdedit /set {yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy} winpe yes
——开启winpe支持
bcdedit /set {yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy} nx optin
——设置nx为optin
bcdedit /displayorder {yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy} /addlast
——设置为最后一项显示。
到此为止大功告成,开机后会出现PE的启动菜单!
但是,这种方法需要手工输入好多东西,并且那两串数字字母实在难啃,下面看批处理。
@echo off&color 0a&mode con lines=30 cols=90
setlocal enabledelayedexpansion
echo.
echo ------------------------------------------------------------------------------
rd %systemdrive%\users\Dir_Test>nul 2>nul
md %systemdrive%\users\Dir_Test>nul 2>nul||(Echo Please run it in administrators right key!&&Pause >nul&&Exit)
rd %systemdrive%\users\Dir_Test>nul 2>nul

echo ------------------------------------------------------------------------------
echo 将Win8.1PE_x64安装在400-600M容量的EFI分区内,防止引导文件和PE受损。
echo PE放于指定盘根目录下WinPE文件夹,设备文件Boot.sdi和启动文件Boot.wim也固定。
:CheckHave
set    bHaveLEFI=n
set /p bHaveLEFI=请问EFI或引导分区是否已有盘符,现在设法分配,核实后输入小写y----
if not !bHaveLEFI!==y goto CheckHave

set    bIsUEFI=y
set /p bIsUEFI=请问BIOS是否UEFI,默认是,不是请输入小写n----

:InputLPE
set    LabelPE=null
set /p LabelPE=默认将本PE安装到本机硬盘,请查看PE源文件所在盘,输入盘符----
if not exist !LabelPE!:\boot\boot.sdi echo 你输入的PE盘符有问题,找不到boot.sdi!&&goto InputLPE
if not exist !LabelPE!:\sources\boot.wim echo 你输入的PE盘符有问题,找不到boot.wim!&&goto InputLPE

:InputLEFI
set    LabelEFI=null
set /p LabelEFI=输入EFI分区盘符----
if not exist !LabelEFI!: echo 这个盘符根本就没有使用了,你不要搞笑好吧!&&goto InputLEFI

if not exist !LabelEFI!:\winpe\ md !LabelEFI!:\winpe\
copy /y !LabelPE!:\boot\boot.sdi !LabelEFI!:\winpe\
copy /y !LabelPE!:\sources\boot.wim  !LabelEFI!:\winpe\

::创建设备项
bcdedit /create /d "Win81PE_x64" /device>%~dp0fdid.txt
::取得所生成的设备标识符
for /f "tokens=2 delims= "  %%i in (%~dp0fdid.txt) do (set fdid=%%i)

::设置设备所在分区
bcdedit /set !fdid! ramdisksdidevice partition=!LabelEFI!:
::设置设备所在的固定路径
bcdedit /set !fdid! ramdisksdipath \winpe\boot.sdi

::创建菜单项
bcdedit /create /d "Win81PE_x64" /application osloader>%~dp0fmid.txt
::取得所生成的菜单标识符
for /f "tokens=2 delims= "  %%i in (%~dp0fmid.txt) do (set fmid=%%i)
echo !fmid!

::设置启动设备
bcdedit /set !fmid! device ramdisk=[!LabelEFI!:]\winpe\boot.wim,!fdid!

::设置系统设备
bcdedit /set !fmid! osdevice ramdisk=[!LabelEFI!:]\winpe\boot.wim,!fdid!

::设定启动程序(winload)的路径
if not !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.efi
if     !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.exe

::设置系统根目录
bcdedit /set !fmid! systemroot \windows

::开启detecthal支持
bcdedit /set !fmid! detecthal yes

::开启WinPE支持
bcdedit/set !fmid! winpe yes

::设置nx为optin
bcdedit /set !fmid! nx optin

::设置为最后一项显示
bcdedit/displayorder !fmid! /addlast

bcdedit /enum all
pause
del /f  /s /q %~dp0fdid.txt
del /f  /s /q %~dp0fmid.txt


作者: renchmin    时间: 2013-12-10 14:16
使用这个软件来修改启动菜单还是很方便很直观的啊。
作者: 2012morningstar    时间: 2013-12-10 22:26
谢谢兄弟写了这么详细的技术贴,这种纯技术贴很少见了,在这个急功近利的社会!
作者: chshrm    时间: 2014-1-12 18:22
非常感谢楼主分享这方面的技术,全部看完了!终于搞明白了系统启动管理的过程,看完这篇文章,再去操作bootice,就如鱼得水了!
作者: 詹姆斯草    时间: 2014-1-12 19:46
早点发现这贴,就不会走那么多弯路了!
作者: 2012kingpen    时间: 2014-1-28 16:50
辛苦了,不错的技术帖。。。学到了不少!
作者: 2011nlby    时间: 2014-5-17 20:03
添加windowpe 里那个另一个guid怎么出来的?求解
作者: 2011htpcfans    时间: 2014-5-17 21:07
::创建设备项
bcdedit /create /d "Win81PE_x64" /device>%~dp0fdid.txt
::取得所生成的设备标识符
for /f "tokens=2 delims= "  %%i in (%~dp0fdid.txt) do (set fdid=%%i)

::设置设备所在分区
bcdedit /set !fdid! ramdisksdidevice partition=!LabelEFI!:
::设置设备所在的固定路径
bcdedit /set !fdid! ramdisksdipath \winpe\boot.sdi

::创建菜单项
bcdedit /create /d "Win81PE_x64" /application osloader>%~dp0fmid.txt
::取得所生成的菜单标识符
for /f "tokens=2 delims= "  %%i in (%~dp0fmid.txt) do (set fmid=%%i)


本来在命令提示符中执行一次BcdEdit /Create命令,正常结果会返回一串类似于{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}/{yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy}格式的字符串,就是GUID,我用重定向符">"把产生的这个字符串输入到当前目录下的一个fdid.txt / fmid.txt文件中,这样我就好使用命令再把它读出来,当然不是人打开文件去读。

作者: DIY-凌风    时间: 2014-5-19 18:11
新手学习报道,谢谢分享
作者: wuyiu    时间: 2014-6-7 09:44
谢谢楼主,新手学习了。
作者: hxming    时间: 2014-6-10 22:13
本帖最后由 hxming 于 2014-6-10 22:20 编辑




看楼主的这个帖子受益匪浅
尝试了修改一下如上图所示启动菜单顺序,但是不成功。
现在想请教一下:
电脑非法关机重启后,
默认选择启动“修复计算机”
能不能让他默认选择“正常启动Windows”?

谢谢!





作者: wylgogogo    时间: 2014-7-14 16:11
楼上得,这个貌似不能吧。这个不是bcd编辑范围。
作者: agenthoward    时间: 2014-7-15 17:07
  1. 如:bcdedit /store "C:\1.bcd" /create {ntldr} /d "XP"创建一个XP的启动项:bcdedit /create {ntldr} /d "XP"
  2. 这样做的好处是先做好试验,最后再导入到系统BCD中。   
复制代码




你写的这些文字 都不换行的,语义上根本看不懂它的逻辑,请你分行或者修改一下他的表达可以吗?我在看。
作者: agenthoward    时间: 2014-7-15 17:53
我服了,这些文字承上启下的逻辑又模糊化了,看不懂了。

能修改一下吗?

你看

删除(WinPE)操作系统的数值开机项目:
bcdedit /deletevalue winpe
  删除来自指定的操作的 Windows PE 数值系统开机项目:
  bcdedit /deletevalue winpe
  /set 设定项目选择项数值。
  设定操作系统“cbd971bf-b7b8-4885-951a-fa03044f5d71”引导分区“C”:
  bcdedit /set device partition=C:
作者: 2011htpcfans    时间: 2014-7-15 20:28
agenthoward 发表于 2014-7-15 17:53
我服了,这些文字承上启下的逻辑又模糊化了,看不懂了。

能修改一下吗?

呵呵,谢谢兄弟提醒,这篇陋贴本是他山之石仅供引玉,修改这里面的纰漏似有必要或无必要,请各位读者见谅笑过。
作者: agenthoward    时间: 2014-7-17 10:11
bootice这种工具真心不想用。
就用你的这种original的方法。

bice有毒都不知道呢 呵呵  
有问题我在这篇文章里提出来 希望你能回答。
你别离开无忧
作者: agenthoward    时间: 2014-7-17 10:15
本帖最后由 agenthoward 于 2014-7-18 17:34 编辑

删除
作者: agenthoward    时间: 2014-7-18 09:39
重大错误,老兄,

这个
  1. 设置{ntldr}入口的path值,这里指定引导程序所在路径,xp是在c:/ntldr;
  2. bcdedit /store c:/bcdwolf /set {ntldr} path /ntldr
复制代码


应该为 :

  1. bcdedit /store c:/bcdwolf /set {ntldr} path ../ntldr
复制代码



否则不成功!请回复你的看法! 我试过!


作者: 2011htpcfans    时间: 2014-7-18 12:39
本帖最后由 2011htpcfans 于 2014-7-18 12:40 编辑
agenthoward 发表于 2014-7-18 09:39
重大错误,老兄,

这个


整篇帖子前2/3明显不是我的风格,后1/3我才做了少许改动,看完这篇帖子只要知道个概念就行了,不用细究。
真正要用原始命令BcdEdit+copy去修复引导时情况肯定千差万别,这个帖子就是给大家培养个方向感而已。


下面是一段无责任引导项修复代码,大家有兴趣可以看看,没什么营养价值的。

@echo off&mode con cols=90
title pwDD_Marc倾力提供
color 0a
setlocal enabledelayedexpansion
echo.
echo.
echo    ^>^>^>       DiskPart-Dism-Boot-BCD-PE-SysPrep-小型工具包      ^<^<^<
echo.
@echo ---------------------------------------------------------------------------
rd %systemdrive%\users\Dir_Test>nul 2>nul
md %systemdrive%\users\Dir_Test>nul 2>nul||(Echo 请使用右键管理员身份运行&&Pause >nul&&Exit)
rd %systemdrive%\users\Dir_Test>nul 2>nul

echo                                             任务开始时间是%time:~,2%点%time:~3,2%分%time:~6,2%秒
echo.
set /a Tday=0
set "T1=%time%"

echo 需要用到Dism、Diskpart、BCDBoot、BootSect和Find命令,如果不支持请现在退出!
echo.

::取得当前目录控制权,解决访问被拒的问题,PE可能不支持两条命令,要报错,后续无影响!
set bIcacls=n
set /p bIcacls=是否需要取得当前目录的所有权,默认不需要,PE中不需要,需要输入小写y----
if  !bIcacls!==y takeown /f %~dp0 /r /d y>nul 2>nul&&echo y|icacls %~dp0 /t /q /grant %username%:f>nul 2>nul
if  !bIcacls!==y icacls %~dp0common /remove:d administrator /t >null
:op
cls
echo      ╔┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╗
echo      ┋  任务类型 1: Dism应用映像安装系统。                            ┋
echo      ┋                                                                ┋
echo      ┋  任务类型 2: Dism捕获映像备份系统。                            ┋
echo      ┋                                                                ┋
echo      ┋  任务类型 3: Dism导出映像整理文件。                            ┋
echo      ┋                                                                ┋
echo      ┋  任务类型 4: BCDBoot、BootSect常规引导修复重建。               ┋
echo      ┋                                                                ┋
echo      ┋  任务类型 5: Diskpart磁盘分区。                                ┋
echo      ┋                                                                ┋
echo      ┋  任务类型 6: 为卷(某分区如ESP)分配装载或删除盘符。             ┋
echo      ┋                                                                ┋
echo      ┋  任务类型 7: 在某目录中新建定容vhd虚拟磁盘文件,同时装载。     ┋
echo      ┋                                                                ┋
echo      ┋  任务类型 8: 装载或卸载指定虚拟磁盘文件。                      ┋
echo      ┋                                                                ┋
echo      ┋  任务类型 9: 全新硬盘分区与Dism安装系统一条龙。                ┋
echo      ┋                                                                ┋
echo      ┋  任务类型10: 全新硬盘分区与Ghost安装系统一条龙。               ┋
echo      ┋                                                                ┋
echo      ┋  任务类型11: Ghost分区备份与恢复安装。                         ┋
echo      ┋                                                                ┋
echo      ┋  任务类型12: 将本PE安装于本地硬盘EFI/MBR中独立引导分区。       ┋
echo      ┋                                                                ┋
echo      ┋  任务类型13: 系统集成与功能调整。                              ┋
echo      ┋                                                                ┋
echo      ┋  任务类型14: SysPrep封装Win8.1/8/7 x64 x86系统。               ┋
echo      ┋                                                                ┋
echo      ┋  任务类型15: 为Win8.1/8/7 x64 x86系统添加引导菜单项。          ┋
echo      ┋                                                                ┋
echo      ┋  任务类型16: 删除Win8.1/8/7 x64 x86系统引导菜单项。            ┋
echo      ┋                                                                ┋
echo      ╚┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉╝

echo list vol>%temp%\DiskPart.txt
diskpart /s %temp%\DiskPart.txt

echo.
set    OpChoice=0
set /p OpChoice=请选则任务类型,输入有效序号----
echo.

::凡涉及输入引导菜单项名字的,可以输入空格,再回车,引导项名字就是空,这样看起来就像没有这个引导项,娱乐娱乐!

if !OpChoice!==15 (

   set    bIsUEFI=y
   set /p bIsUEFI=请问BIOS是否UEFI,默认是,不是请输入小写n----
   echo.
   set bHvLab=n
   set /p bHvLab=采用MBR但无独立引导,或者MBR中独立引导分区/ESP分区如已有盘符,输入y,其余直接回车----
   echo.
   if  !bHvLab!==y (
      set /p LabelEFI=请输入ESP分区或MBR中独立引导分区盘符或者MBR无独立引导分区时的系统盘符----
   )
   if  not !bHvLab!==y (
      ::给EFI或者MBR中独立引导分区分配盘符
      set bHvSetESP=n
      for %%i in (z y x w v u t s r q p o n m) do (
         if !bHvSetESP!==n ( if  not exist %%i: set LabelEFI=%%i&&set bHvSetESP=y )
      )
      echo list vol>%temp%\DiskPart.txt
      diskpart /s %temp%\DiskPart.txt
      set /p NumVolESP=请输入GPT中ESP分区或MBR中独立引导分区的卷编号,直接回车----
      echo select vol !NumVolESP!>%temp%\DiskPart.txt
      echo assign letter=!LabelEFI!>>%temp%\DiskPart.txt
      diskpart /s %temp%\DiskPart.txt
   )
   bcdedit /create {bootmgr} /d "Marc Boot Manager" >nul 2>nul
   bcdedit /set {bootmgr} device partition=\device\harddiskvolume!NumVolESP! >nul 2>nul

   echo.
   set     b8Boot=n
   set /p  b8Boot=请问是否建8.1/8/7引导,默认不,如果要建输入小写y----
   echo.
   if !b8Boot!==y (
       ::创建8.1/8/7引导项
      set l_Sys8=null
      set /p l_Sys8=请问要为哪个盘的Windows 8.1/8/7建立引导,输入盘符----
      echo.
      set    name_MenuWindows=Windows_8.1/8/7
      set /p name_MenuWindows=默认菜单项名字Windows_8.1/8/7,可自行输入不带空格名字,如Windows_7----

      bcdedit /create /d "!name_MenuWindows!" /application osloader>%temp%\fmid.txt
      for /f "tokens=2 delims= "  %%i in (%temp%\fmid.txt) do (set fmid=%%i)
      bcdedit /set !fmid! device partition=!l_Sys8!:
      if not !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.efi
      if     !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.exe
      bcdedit /set !fmid! osdevice partition=!l_Sys8!:
      bcdedit /set !fmid! systemroot  \windows
      bcdedit /displayorder !fmid! /addlast
   )

   echo.
   set     b8VhdBoot=n
   set /p  b8VhdBoot=请问是否建8.1/8/7 VHD引导,默认不,如果要建输入小写y----
   echo.
   if !b8VhdBoot!==y (
      ::创建8.1/8/7 VHD引导项
      set namePathVhd=null

      ::准备VHD系统文件与序号。
      set bHvLSr=n
      for /l %%i in (1,1,5) do (
         if !bHvLSr!==n (
            set /p LPartSource=请输入VHD系统文件所在盘,不带冒号----
            if not exist !LPartSource!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
            if     exist !LPartSource!: set bHvLSr=y
         )
      )
      dir !LPartSource!:\*.vhd /b /s >%temp%\fSeek.txt
      echo 查找到!LPartSource!分区下所有VHD文件如下表
      echo -----------------------------------------------------
      set /a a=0
      for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do ( set /a a+=1&&echo 系统映像:!a! %%i)
      set /a CountWim=!a!
      if !a!==0   echo 该分区无系统VHD文件,退出重来吧!&&goto End

      echo.
      set    NumWimSource=1
      set /p NumWimSource=请输入VHD系统文件序号,我不检测无效序号,默认1----
      set bVldNSr=n
      for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y   )
      if !bVldNSr!==n echo 你没有输入有效VHD系统文件序号,退出重来吧!&&goto End


      set /a a=0
      for /f "usebackq delims=" %%i in (%temp%\fSeek.txt) do (
         set /a a+=1
         if !a!==!NumWimSource! (
            set nameTmp=%%i
            echo 你选择的VHD系统文件是:%%i
         )
      )

      set   namePathVhd=!nameTmp:~3!

      echo.
      set    name_MenuVHD=VHD_MBY
      set /p name_MenuVHD=输入菜单项名字,默认VHD_MBY,可自行输入,如MAXDOS_WYS----

      bcdedit /create /d "!name_MenuVHD!" /application osloader>%temp%\fmid.txt
      for /f "tokens=2 delims= "  %%i in (%temp%\fmid.txt) do (set fmid=%%i)
      bcdedit /set !fmid! device vhd=[!LPartSource!:]\!namePathVhd!
      if not !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.efi
      if     !bIsUEFI!==n bcdedit /set !fmid! path \windows\system32\winload.exe
      bcdedit /set !fmid! osdevice vhd=[!LPartSource!:]\!namePathVhd!
      bcdedit /set !fmid! systemroot  \windows
      bcdedit /set !fmid! detecthal  yes
      bcdedit /displayorder !fmid! /addlast
   )

   if     !bIsUEFI!==n (
      echo.
      set     bXP=n
      set /p  bXP=请问是否建XP引导,默认不,如果要建输入小写y----
      if !bXP!==y (
         ::创建XP引导项
         echo.
         set l_SysXP=null
         set /p l_SysXP=请问要为哪个盘的XP建立引导,输入盘符----

         echo.
         set    name_MenuXP=XP_MBY
         set /p name_MenuXP=输入菜单项名字,默认XP_MBY,可自行输入,如MAXDOS_WYS----

         bcdedit /create {ntldr} /d "!name_MenuXP!"
         bcdedit /set {ntldr} device partition=!l_SysXP!:
         bcdedit /set {ntldr} path \ntldr
         bcdedit /displayorder {ntldr} /addlast
      )
   )
   goto End
)

if !OpChoice!==16 (

   bcdedit /enum /v >%temp%\x.txt

   ::取得GUID所在行。
   set  numOrder=null
   set /a a=0
   for /f "delims= " %%i in ( %temp%\x.txt ) do (
      set /a a+=1
      if %%i==displayorder set numOrder=!a!
   )

   find "description"  %temp%\x.txt >%temp%\m.txt

   set /a a=0
   for /f "skip=3 tokens=1,* delims= " %%i in ( %temp%\m.txt ) do (
      echo.
      set    bDel=n
      set /a Tmp=!a!+1
      set /p bDel=系统启动菜单第!Tmp!项是:%%j,请问是否删除,默认不删,删除输入y----

      set /a numItem=!a!+!numOrder!
      if not !bDel!==n (
         set /a c=0
         for /f "tokens=1,* delims= " %%k in ( %temp%\x.txt ) do (
            set /a c+=1
            if !c!==!numItem! (
               if     !numItem!==!numOrder! (
                  set item=%%l
                  bcdedit /delete %%l >nul 2>nul
                  bcdedit /delete %%l /f >nul 2>nul            
               )
               if not !numItem!==!numOrder! (
                  set item=%%k
                  bcdedit /delete %%k >nul 2>nul
                  bcdedit /delete %%k /f >nul 2>nul
               )
            )
         )
      )
      set /a a+=1
   )

   del /f /s /q %temp%\x.txt>nul 2>nul
   del /f /s /q %temp%\m.txt>nul 2>nul
   bcdedit /enum
   goto End
)

:End
echo.
set bProceed=n
set /p bProceed=请问继续其它任务吗,重复运行默认应答选项有效,默认不n,直接回车/是输入小写y----
if !bProceed!==y goto op

del /f  /s /q %temp%\fSeek.txt>nul 2>nul
del /f  /s /q %temp%\fSrSeek.txt>nul 2>nul
del /f  /s /q %temp%\fDsSeek.txt>nul 2>nul
del /f  /s /q %temp%\dirPatSeek.txt>nul 2>nul
del /f  /s /q %temp%\dirDrvSeek.txt>nul 2>nul
del /f  /s /q %temp%\dirIESeek.txt>nul 2>nul
del /f  /s /q %temp%\fPatSeek.txt>nul 2>nul
del /f  /s /q %temp%\ImageInfo.txt>nul 2>nul
del /f  /s /q %temp%\DiskPart.txt>nul 2>nul
del /f  /s /q %temp%\tmp.txt>nul 2>nul
del /f  /s /q %~dp0fAppUntitled.txt>nul 2>nul
del /f  /s /q %~dp0fTmp.txt>nul 2>nul
del /f  /s /q %~dp0null>nul 2>nul
del /f  /s /q %temp%\Out_DiskPart.txt>nul 2>nul
del /f  /s /q %temp%\Out_tmp.txt>nul 2>nul
del /f  /s /q %temp%\tmp.txt>nul 2>nul
del /f  /s /q %~dp0fdid.txt>nul 2>nul
del /f  /s /q %~dp0fmid.txt>nul 2>nul


set "T2=%time%"
if "%T2:~,2%" lss "%T1:~,2%" (set Tday+=8640000)
set   /a "T_d=%Tday%+(%T2:~,2%*360000)+(%T2:~3,1%*60000+%T2:~4,1%*6000)+(%T2:~6,1%*1000+%T2:~7,1%*100)+(%T2:~9,1%*10+%T2:~-1%)-(%T1:~,2%*360000)-(%T1:~3,1%*60000+%T1:~4,1%*6000)-(%T1:~6,1%*1000+%T1:~7,1%*100)-(%T1:~9,1%*10+%T1:~-1%)"
set /a "ss=%T_d%/100%%60"
set /a "mm=%T_d%/6000%%60"
set /a "hh=%T_d%/360000%%1"
set /a "ms=%T_d%%%100"
echo.
echo 任务结束时间是%time:~,2%点%time:~3,2%分%time:~6,2%秒,本次任务消耗时间为 %hh%:%mm%:%ss%.%ms%秒。
echo.
pause

作者: agenthoward    时间: 2014-7-18 15:43
还是和你一起研究好。上面的bat太罗嗦。没有指导意义。呵呵
作者: 太湖渔民    时间: 2014-11-27 09:38
请教楼主,我昨天在win8.1下msconfig,改成安全模式,

在安全模式启动后,到了命令行状态,后面不会用了,关闭窗口后,回不了win8桌面,只有黑色屏幕上一个能动的鼠标键头~~~~

我只想回到安全模式窗口,就能改回设置,有请大神出手相助!
作者: 太湖渔民    时间: 2014-11-27 09:39
本帖最后由 太湖渔民 于 2014-11-27 09:41 编辑

win8.1→安全模式→其他外壳→重启后进入命令行状态,退不出来了,也回不到正常启动状态!

我猜想想bcdedit命令可以修复的
作者: wen18181818    时间: 2014-11-29 19:04
感谢分享!!!!!!!!!!
作者: 2011星星雨    时间: 2014-12-1 22:18
不错的内容,学习一下!
作者: papago    时间: 2018-10-16 15:55
BcdEdit使用指南
作者: menhm    时间: 2018-10-16 16:22
非常感谢楼主分享




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3