@echo off
cd /d %~dp0
rem >nul 屏蔽标准输出在屏幕上的显示,2>nul 是屏蔽出错显示,>nul 2>nul 是无论对错,都屏蔽屏幕显示。
attrib -h -s -r temp_bcd.txt >nul 2>nul
del temp_bcd.txt >nul 2>nul
COLOR 1f
rem ==============以下是全局设置项,自行设置=================
set timeout=2
rem 设置引导在菜单的名称
set gname=逸优启引导菜单
rem 设置文件、文件夹默认名称,默认分别为grldr.mbr,grldr,文件夹是自己修改设置的
set mbrname=eldr.mbr
set ldrname=ldr.e
set ldrfile=wx
rem =========================================================
rem set pingtime=20
rem pingtime是程序操作完成后的自动退出等待时间,调节与否随意,这里已注释掉,手动退出,以方便阅读安装过程。gname是bcd启动菜单显示名称,根据喜好可自己设置,mbrname是mbr的名称,可以自己改名,timeout是bcd菜单等待选择时间,自己随便调
set vid=
set destpart=
Set TIT=【逸优启Vista/Win7 BCD菜单项添加与删除批处理】 By高级菜鸟
TITLE %TIT%
echo.
echo 高级菜鸟 改自lianjiang的批处理(wowfans修改版),并添加了大量帮助新手学习的注释,有兴趣的可自行修改以满足自己的设置要求。
echo.
echo 本批处理将帮助你安全地在VISTA/WIN7/2008/2008R2系统下将【多系统引导】安装或卸载,可自定义要安装的文件的名称,按默认值一直回车即可智能判断,一键完成!
echo.
echo 该批处理与【多系统引导】文件放在一起即可,不需要复制到C盘后运行
echo.
echo 警告!请确定你是在VISTA/WIN7/2008/2008R2系统下运行本批处理,XP系统下不使用本批处理安装!如果不满足条件,请现在关闭窗口退出!
echo.
pause
echo.
echo 检测权限...
rem 直接运行bcdedit相当于bcdedit /enum active列出启动菜单上有的项目,all指所有项目标。加/v用完整标志符取代特殊标识符。下面是将bcd的内容输出到temp_bcd.txt文件中。&&前面的执行失败,后面的不执行
bcdedit >temp_bcd.txt 2>nul
rem type显示文本文件的内容,| 读取前一个命令中的输出作为后一个命令的输入
type temp_bcd.txt | find "Windows Boot Manager" >nul && goto gaosir
rem 若找不到Windows Boot Manager证明不是管理员,删掉刚刚用来记录BCD内容的文件。
del temp_bcd.txt >nul 2>nul
echo 请在VISTA/WIN7/2008/2008R2系统中以管理员身份运行,任意键退出.
pause>nul
exit
:gaosir
echo 权限检测已通过
rem 去掉隐藏等属性,以免后面的操作找不到文件
attrib -h -s -r %mbrname% >nul 2>nul
attrib -h -s -r %ldrname% >nul 2>nul
attrib -h -s -r %ldrfile% >nul 2>nul
attrib -h -s -r %ldrfile%\* >nul 2>nul
set inputv=
echo.
echo 下面将提示你输入grub引导文件、主体文件、相关文件的文件夹的名称方便安装你自己改名的文件。对于本【多系统引导】不需要输入,一路回车确定即可。(文件已为避免与win7软激活相冲突而特意改过名),若需自定义,输入名称时可用TAB键选择或快速补齐。
echo.
echo 以下是扩展名为.mbr的文件列表,一般grub引导文件名应该为下面的文件名,仅供参考
dir /a /b *.mbr
echo.
echo.
set /p inputv=若确实要自定义,请输入要安装或卸载的grub引导文件名(未改名时为grldr.mbr),直接回车采用默认的%mbrname% :
if not "%inputv%"=="" set mbrname=%inputv%&&echo 您输入的引导文件名为:%inputv%
echo.
set /p inputv=若确实要自定义,请输入要安装或卸载的grub主体文件名称(未改名时为grldr),直接回车采用默认的%ldrname% :
if not "%inputv%"=="" set ldrname=%inputv%&&echo 您输入的grub主体文件名为:%inputv%
echo.
set /p inputv=若确实要自定义,请输入要安装或卸载的放有【多系统引导】有关文件的文件夹,直接回车采用默认的%ldrfile%文件夹 :
if not "%inputv%"=="" set ldrfile=%inputv%&&echo 您输入的文件夹名为:%inputv%
echo.
echo.
if not exist %mbrname% echo 请注意,当前目录下没有%mbrname%文件,但仍可以继续安装,安装完成时会提示您将%mbrname%等文件手动复制到您即将选择的安装盘中。(注意:若%mbrname%文件所在位置与将要复制到的位置相同,由于无法自身复制,所以仍会错误的提示要手动复制,这没关系!)&pause
rem defdest:自定义分区
set defdest=%systemdrive%
rem 找到并设定含有bcd的盘符作为默认安装位置,搜到光驱时可能会弹出没有磁盘!如果不是多系统(特别是不止一个vista以上系列的系统),BCD一般就在系统盘,就算不是,%destpart%也是可以自定义位置的,下面的搜索其实意义不大。
for %%i in (c d e f g h i j k l m n o p q r s t u v w x y z) do if exist %%i:\Boot\BCD set defdest=%%i:
rem mbrname的路径,就放根目录下
set mbrpath=\%mbrname%
rem destpart:分区,defdest:自定义分区
rem 将寻找%mbrpath%决定是安装还是卸载放在寻找defdest后,是为了无论是安装还是卸载都能找到destpart的正确位置
set destpart=%defdest%
rem 如果在temp_bcd.txt中找到了%mbrpath%(屏蔽输出),就转到卸载否则继续安装。
type temp_bcd.txt | find "%mbrpath%" >nul && goto un_bcd
goto seldest
:seldest
COLOR 1f
set inputv=
echo.
echo 请输入%mbrname%文件的安装盘符,直接回车采用%destpart%盘根目录
echo 输入盘符时不用输入冒号,如D盘输入D或d即可
echo.
set /p inputv=输入盘符(不带冒号),请直接回车使用默认%destpart%盘:
if not "%inputv%"=="" set destpart=%inputv%:
if not exist "%destpart%\" goto patherr
rem 试着随便创建一个目录:sbcjdygml
md %destpart%\sbcjdygml
rem 创建不成功,转到写错误:writerr
if not exist "%destpart%\sbcjdygml" goto writerr
rem 存在,表示可写,删除这个随便创建的目录
rd "%destpart%\sbcjdygml"
goto bcd_1
rem 路径错误
:patherr
COLOR 16
cls
echo 指定盘符%destpart%无效, 按任意键重新指定!!!
pause
goto seldest
rem 指定盘不可写入
:writerr
COLOR 16
cls
echo.
echo 指定盘不可写入, 可能为光驱, 请重新指定 !!!
pause
goto seldest
rem 编辑BCD,安装引导
:bcd_1
echo.
echo 正在将"%gname%"项添加到BCD
rem create创建一个启动项,/d 指定菜单里的文字。XP示例:bcdedit /create {ntldr} /d "Win XP"
rem VISTA:bcdedit /create /d "VISTA" /application osloader
rem osloader:操作系统加载器,bootsector:启动扇区
bcdedit /create /d "%gname%" /application bootsector >vid.ini
for,/f,"tokens=2 delims={",%%i,In (vid.ini) Do set vida=%%i
rem 变量vid记录启动项标识符
for,/f,"tokens=1 delims=}",%%i,In ("%vida%") Do set vid={%%i}
rem 设置文件路径
bcdedit /set %vid% device partition=%destpart% >nul
bcdedit /set %vid% path %mbrpath% >nul
rem displayorder设置启动项启动顺序,如:bcdedit /displayorder {legacy} {current} 将首先显示Windows XP,然后再显示默认启动的系统如Windows 7;不清楚具体情况可加 /addfirst /addlast参数,如:将现在安装的【多系统引导】项放最后:bcdedit /displayorder %vid% /addlast >nul
rem {legacy} :指存在上一代Windows系统如Windows XP的硬盘或分区;{default} : 默认操作系统所在硬盘或分区;{current} : 当前硬盘或分区;
bcdedit /displayorder %vid% /addfirst >nul
bcdedit /timeout %timeout% >nul
rem 设置默认启动项,如:bcdedit /default %vid% 设定现在添加的项目为默认启动项 ; bcdedit /default {ntldr} 设定默认启动操作系统为NTLDR;bcdedit /default {current} 将目前所处的操作系统作为默认启动的项目。
rem 如果想保留现在默认启动项目不变动,请去掉或注释掉下面这条
bcdedit /default {current}
echo.
echo BCD菜单项"%gname%"添加完成
rem 复制文件,更改文件属性,去掉要复制文件(否则无法复制)及已存在同名文件的隐藏、系统、只读,复制后再给源和目标加上隐藏、系统、只读。
if exist %mbrname% (
echo.
echo 开始复制文件到安装目录……
attrib -h -s -r %destpart%\%mbrname% >nul 2>nul
copy %mbrname% %destpart%\ /y
attrib +h +s +r %destpart%\%mbrname%
attrib +h +s +r %mbrname%
attrib -h -s -r %destpart%\%ldrname% >nul 2>nul
copy %ldrname% %destpart%\ /y
attrib +h +s +r %destpart%\%ldrname%
attrib +h +s +r %ldrname%
rem 复制文件夹,不使用DOS外部命令xcopy,因为我不知道精简系统的CMD里有没有该命令
rem 先在目标位置创建一个文件夹%ldrfile%
attrib -h -s -r %destpart%\%ldrfile% >nul 2>nul
attrib -h -s -r %destpart%\%ldrfile%\* >nul 2>nul
rd /s /q %destpart%\%ldrfile%\ >nul
md %destpart%\%ldrfile%
rem %ldrfile%后不能加\
copy %ldrfile%\ %destpart%\%ldrfile%\ /y
attrib +h +s +r %destpart%\%ldrfile%\*
attrib +h +s +r %destpart%\%ldrfile%
attrib +h +s +r %ldrfile%
echo.
echo 复制完成
goto exit
) else (
echo 若有复制失败,请稍后请自行把%mbrname%等多系统引导文件及文件夹拷贝到%destpart%\根目录
echo.
rem set /a pingtime=%pingtime%+8
Goto exit
)
:un_bcd
COLOR 2f
echo.
echo 系统的BCD启动项中存在项目["%mbrpath%"]。
echo ==============================================
echo.
set un_bcd=
Set /P un_bcd= 是否需要卸载%mbrpath%项目?[y/是 n/否]:
If /i %un_bcd%#==y# goto un_bcd_1
rem &第一项执行失败不影响第二项执行
If /i %un_bcd%#==n# echo 卸载已取消...&goto exit
cls
echo.
echo 选择错误,请输入Y或者N(不分大小写)后继续
Goto un_bcd
:un_bcd_1
for /f "tokens=1 delims=:" %%i In ('findstr /n %mbrpath% temp_bcd.txt') Do (
Set nid=%%i
)
set /a nid=%nid%-3
for /f "skip=%nid% tokens=2" %%i in (temp_bcd.txt) do set vid=%%i&goto vidok
:vidok
bcdedit /delete %vid% /cleanup >nul
bcdedit /timeout %timeout% >nul
bcdedit >temp_bcd.txt
rem 菜单中可能有多个重复的%mbrpath%项目录,转回再试直到所有的都清除
type temp_bcd.txt | find "%mbrpath%" >nul && goto un_bcd
echo.
echo 已成功卸载%mbrname%项目
rem 前面如果设置了新增的项目为默认启动项,则卸载后要设一个其它的项目为默认
bcdedit /default {current}
rem 显示之前被隐藏了的文件,以便下面判断是否存在该文件,否则会误判。
attrib -h -s -r %destpart%\%mbrname% >nul 2>nul
attrib -h -s -r %destpart%\%ldrname% >nul 2>nul
attrib -h -s -r %destpart%\%ldrfile% >nul 2>nul
attrib -h -s -r %destpart%\%ldrfile%\* >nul 2>nul
if exist %destpart%\%mbrname% (
echo.
echo 清理残留的文件……
attrib -h -s -r %destpart%\%mbrname% >nul 2>nul
del %destpart%\%mbrname% >nul
attrib -h -s -r %destpart%\%ldrname% >nul 2>nul
del %destpart%\%ldrname% >nul
rem %ldrfile%后不能加\
attrib -h -s -r %destpart%\%ldrfile% >nul 2>nul
attrib -h -s -r %ldrfile%\* >nul 2>nul
rem %ldrfile%后可加可不加\
rd /s /q %destpart%\%ldrfile%\ >nul 2>nul
echo.
echo 文件清理完成
)
:exit
COLOR 0f
attrib -h -s -r temp_bcd.txt >nul 2>nul
del temp_bcd.txt >nul 2>nul
del vid.ini >nul 2>nul
echo.
echo 请保留该安装与卸载批处理文件,以便以后卸载(或再次安装)【多系统引导】时使用!
echo.
PAUSE >nul
rem echo %pingtime%秒后窗口自动关闭
rem ping -n %pingtime% 127.0.0.1 >nul
exit