在试用测试期间为了方便使用,偶写了几个脚本,现在拿出与大家分享:
上海IT外包服务网
共四个脚本:
1.加载VHD.cmd
2.卸载VHD.cmd
3.自定义安装VHD虚拟设备到BCD引导菜单.cmd
4.全自动安装VHD虚拟设备到BCD引导菜单_懒人代码.cmd
这里说一下脚本功能,偶在前几次测试时加卸载VHD文件都要 diskmgmt.msc 才能加卸载VHD,很麻烦,所以写了 “1.加载VHD.cmd” 和 “2.卸载VHD.cmd” 是为了方便加卸载VHD文件,使用时直接将VHD文件拖到 “1.加载VHD.cmd” 和 “2.卸载VHD.cmd” 上即可,也可以执行此两个CMD后将VHD文件拖放到命令行窗口 ……
接下来偶测试将VHD安装到BCD引导菜单,所以写了 “3.自定义安装VHD虚拟设备到BCD引导菜单.cmd” 主要是能自定义VHD在启动菜单中的名称!使用此脚本需要手动输入VHD文件位置,及输入VHD在BCD引导菜单中将使用的名称,安装到BCD引导菜单前将自动备份当前BCD菜单,安装完成后在VHD文件所在位置自动生成卸载当前VHD在BCD菜单中的脚本,方便卸载 ……
因为老是装了又卸,使用 “3.自定义安装VHD虚拟设备到BCD引导菜单.cmd” 需要手动输入浪费许多时间,所以又写了个 “4.全自动安装VHD虚拟设备到BCD引导菜单_懒人代码.cmd” 使用时直接将VHD文件拖到此脚本上即可,也可以执行此脚本后将VHD文件拖放到命令行窗口,将自动将VHD安装到BCD引导菜单,安装前将自动备份当前BCD菜单,安装完成后在VHD文件所在位置自动生成卸载当前VHD在BCD菜单中的脚本,安装将使用“VHD文件的名称 + 虚拟设备驱动器”做为BCD引导菜单中的名称 ……
这里提醒下新人:
安装时自动备份当前BCD引导文件到:
“%SystemDrive%[系统盘:]\BOOT\BCD_Backup\[当前年月日及时间]\” 到此文件夹中执行 “还原此文件包中的引导菜单备份.CMD” 可还原安装前的BCD引导!
安装后将在VHD文件所在路径中生成卸载脚本!
到“[你的VHD路径]” 执行 “你的VHD文件名_卸载引导菜单.CMD” 可卸载此安装!
下面贴出代码:
加载VHD.cmd
- @ECHO OFFSETLOCAL ENABLEDELAYEDEXPANSION
- CLS
- COLOR 2E
- MODE CON: COLS=56 LINES=23
- TITLE 正在加载VHD文件
- CLS
- :: 重置变量
- SET EX=
- SET NAMEEX=
- SET VHD_PATH=
- :: 获取操作信息
- if "%1"=="" GOTO :HELP_VHD
- if "%1"=="%~0" GOTO :LOAD_VHD
- if "%1"=="%~dp0%~n0%~x0" GOTO :LOAD_VHD
- :LOAD_VHD
- :: 得到文件路径完整信息
- SET VHD_PATH=%1
- GOTO SLOAD_VHD
- :SLOAD_VHD
- :: 获取VHD文件的路径名称等信息
- for /f "delims==" %%i in ("%VHD_PATH%") Do (
- SET "NAMEEX=%%~nxi"
- SET "EX=%%~xi"
- )
- if /i "%EX%" == ".VHD" (ECHO.ECHO.正在加载 %VHD_PATH% …) ELSE GOTO :NO_VHD
- :: 写加载VHD的DiskPart脚本文件
- ECHO select vdisk file=%VHD_PATH%>InVHDS
- ECHO attach vdisk>>InVHDS
- ECHO list disk>>InVHDS
- :: 用DiskPart脚本加载VHD,完成后删除DiskPart脚本,退出!
- Diskpart /s InVHDS
- DEL /F /Q InVHDS
- EXIT
- :HELP_VHD
- COLOR 2E
- MODE CON: COLS=56 LINES=13
- TITLE 拖放您要加载的VHD文件到此 …
- ECHO.
- ECHO.
- ECHO. 请将您要加载的VHD文件拖放到本窗口中!然后按回车键!
- ECHO.
- ECHO.
- ECHO. 注意:VHD不要在带有空格的目录中,VHD文件名没有空格!
- ECHO.
- ECHO.
- SET VHD_PATH=
- SET /P VHD_PATH=
- COLOR 2E
- MODE CON: COLS=56 LINES=23
- TITLE 正在加载VHD文件
- CLS
- GOTO SLOAD_VHD
- :NO_VHD
- COLOR 4E
- MODE CON: COLS=56 LINES=13
- TITLE %VHD_PATH% 不是VHD文件 …
- ECHO.
- ECHO. !!!错误 !!!
- ECHO.
- ECHO.
- ECHO. 无法加载 %VHD_PATH%
- ECHO.
- ECHO. %NAMEEX% 不是VHD文件!!!
- ECHO.
- ECHO.
- ECHO. 请按任意键继续 ……
- ECHO.
- Pause >nul
- SET EX=
- SET NAMEEX=
- SET VHD_PATH=
- GOTO HELP_VHD
- @ECHO OFFSETLOCAL ENABLEDELAYEDEXPANSION
- CLS
- COLOR 2E
- MODE CON: COLS=56 LINES=23
- TITLE 正在卸载VHD文件
- CLS
- :: 重置变量
- SET EX=
- SET NAMEEX=
- SET VHD_PATH=
- :: 获取操作信息
- if "%1"=="" GOTO :HELP_VHD
- if "%1"=="%~0" GOTO :UNINS_VHD
- if "%1"=="%~dp0%~n0%~x0" GOTO :UNINS_VHD
- :UNINS_VHD
- :: 得到文件路径完整信息
- SET VHD_PATH=%1
- GOTO SUNINS_VHD
- :SUNINS_VHD
- :: 获取VHD文件的路径名称等信息
- for /f "delims==" %%i in ("%VHD_PATH%") Do (
- SET "NAMEEX=%%~nxi"
- SET "EX=%%~xi"
- )
- if /i "%EX%" == ".VHD" (ECHO.ECHO.正在加载 %VHD_PATH% …) ELSE GOTO :NO_VHD
- :: 写卸载VHD的DiskPart脚本文件
- ECHO select vdisk file=%VHD_PATH%>UnVHDS
- ECHO detach vdisk>>UnVHDS
- ECHO list disk>>UnVHDS
- ECHO select vdisk file=%VHD_PATH%>>UnVHDS
- ECHO detach vdisk>>UnVHDS
- :: 用DiskPart脚本卸载VHD,完成后删除DiskPart脚本,退出!
- Diskpart /s UnVHDS
- DEL /F /Q UnVHDS
- EXIT
- :HELP_VHD
- COLOR 2E
- MODE CON: COLS=56 LINES=13
- TITLE 拖放您要卸载的VHD文件到此 …
- ECHO.
- ECHO.
- ECHO. 请将您要加载的VHD文件拖放到本窗口中!然后按回车键!
- ECHO.
- ECHO.
- ECHO. 注意:VHD不要在带有空格的目录中,VHD文件名没有空格!
- ECHO.
- ECHO.
- SET VHD_PATH=
- SET /P VHD_PATH=
- COLOR 2E
- MODE CON: COLS=56 LINES=23
- TITLE 正在卸载VHD文件
- CLS
- GOTO SUNINS_VHD
- :NO_VHD
- COLOR 4E
- MODE CON: COLS=56 LINES=13
- TITLE %VHD_PATH% 不是VHD文件 …
- ECHO.
- ECHO. !!!错误 !!!
- ECHO.
- ECHO.
- ECHO. 无法卸载 %VHD_PATH%
- ECHO.
- ECHO. %NAMEEX% 不是VHD文件!!!
- ECHO.
- ECHO.
- ECHO. 请按任意键继续 ……
- ECHO.
- Pause >nul
- SET EX=
- SET NAMEEX=
- SET VHD_PATH=
- GOTO HELP_VHD
自定义安装VHD虚拟设备到BCD引导菜单.cmd
- @ECHO OFF
- COLOR 2E
- TITLE 安装与设置VHD虚拟磁盘
- CLS
- Set VHDNAME=
- Set VHDNAMES=
- SET VHD_DISK=
- SET BCDEDITS=
- SET VHDBOOTIDA=
- SET VHD_ID=
- SET VHD_WINS=
- SET VHDBOOTIDA=%%i
- SET VHD_ID=
- :: 当前时间
- SET tm1=%time:~0,2%
- SET tm2=%time:~3,2%
- SET tm3=%time:~6,2%
- :InVHDCMD
- :: ########################################################################
- ECHO.
- ECHO.
- ECHO. 输入您的VHD文件名称,注意包括 .VHD 扩展名
- ECHO.
- ECHO. 您的 VHD 文件名最好不要带空格,!可能出错 !
- ECHO.
- ECHO. 如果带路径请输入,例如: VHD\Windows7\Windows7.vhd (不要带盘符与\号)
- ECHO.
- ECHO.
- Set VHDNAME=
- Set /P VHDNAME=输入VHD全名, 然后回车 :
- :: ########################################################################
- ECHO.
- ECHO.
- ECHO. 输入您希望显示的启动菜单名称,即启动列表中显示的名称!
- ECHO.
- ECHO. 例如:Windows 7 VHD 虚拟机系统
- ECHO.
- ECHO.
- Set VHDNAMES=
- Set /P VHDNAMES=输入VHD全名, 然后回车 :
- :: ########################################################################
- :: 全盘搜索用户输入的VHD文件
- for %%a in (A: B: 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 %%a\%VHDNAME% SET VHD_DISK=%%a
- )
- :: 如果没有找到VHD文件,反馈信息给用户
- if not exist %VHD_DISK%\%VHDNAME% goto DoesNotVHD
- :: ########################################################################
- :: 给脚本当前bcdedit文件位置,重置VHDBOOTIDA及VHD_ID变量
- SET BCDEDITS=%SystemRoot%\system32\bcdedit.exe
- SET VHDBOOTIDA=
- SET VHD_ID=
- :: 获取当前启动菜单列表,并搜索当前项目是否已安装
- %BCDEDITS% >bcdtemp.txt
- TYPE bcdtemp.txt | find "\%VHDNAME%" >nul & goto ON_VHDS
- :: ########################################################################
- :: 找到VHD,写VHD的安装DiskPart脚本文件
- ECHO select vdisk file=%VHD_DISK%\%VHDNAME%>InVHDS
- ECHO attach vdisk>>InVHDS
- :: 写VHD的卸载DiskPart脚本文件
- ECHO select vdisk file=%VHD_DISK%\%VHDNAME%>UnVHDS
- ECHO detach vdisk>>UnVHDS
- ECHO list disk>>UnVHDS
- ECHO select vdisk file=%VHD_DISK%\%VHDNAME%>>UnVHDS
- ECHO detach vdisk>>UnVHDS
- :: 使用DiskPart脚本安装当前的虚拟磁盘
- diskpart /s InVHDS
- choice /t 5 /d y /n
- :: ########################################################################
- :: 备份启动引导BCD菜单文件,以备还原时用
- :: 备份到[系统盘:\BOOT\BCD_Backup\当前时间日期\]
- :: 到BCD备份目录中执行“还原此文件包中的引导菜单备份.CMD”即可还原以下备份
- if not exist "%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分" MD "%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分"
- %BCDEDITS% /export "%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\BCD_Backup"
- :: 创建一个还原当前BCD备份的脚本
- ECHO @ECHO OFF>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
- ECHO ECHO.>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
- ECHO SET ADIRS=%%~dp0>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
- ECHO SET BCDEDITS=%%SystemRoot%%\system32\bcdedit.exe>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
- ECHO ECHO.>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
- ECHO %%BCDEDITS%% /import "%%ADIRS%%BCD_Backup">>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
- ECHO ECHO.>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
- ECHO ECHO. 请查看当前有无错误,请按任意键退出!>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
- ECHO Pause^>nul 2^>nul>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
- :: ########################################################################
- :: 获取已加载的VHD盘符目录,如果已安装系统则复制VHD系统引导信息到当前系统
- for %%b in (A: B: 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 %%b\Windows\System32\bcdboot.exe SET VHD_WINS=%%b
- )
- if not exist %VHD_WINS%\Windows\System32\bcdboot.exe goto NotVHDWINS
- :: 当前系统文件及VHD中系统文件变量
- SET SYSA=%SystemRoot%\system32\bcdboot.exe
- SET SYSV=%VHD_WINS%\Windows\System32\bcdboot.exe
- :: 如果搜索到是当前系统中的bcdboot.exe,则跳过从VHD中复制启动到当前系统的指令
- if /i "%SYSA%" == "%SYSV%" (ECHO.ECHO.VHD中没有安装操作系统 …&ECHO.&ECHO.跳过从VHD中复制引导信息 …&GOTO NotVHDWINS) ELSE ECHO.&ECHO.从VHD系统中复制引导信息到当前系统 …
- ECHO.
- CD %VHD_WINS%\Windows\System32
- bcdboot %VHD_WINS%\Windows /s %SYSTEMDRIVE%
- :: ########################################################################
- :NotVHDWINS
- :: 为当前项目创建一个ID,输出文本并去掉{}前后无用字串
- %BCDEDITS% /create %VHD_ID% /d "%VHDNAMES%" /application osloader >vhdbootid.ini
- for,/f,"tokens=2 delims={",%%i,In (vhdbootid.ini) Do (
- SET VHDBOOTIDA=%%i
- )
- for,/f,"tokens=1 delims=}",%%i,In ("%VHDBOOTIDA%") Do (
- SET VHD_ID={%%i}
- )
- :: 输出记录当前项目ID以便备后用,如果您不需要此文件可以在其前面添加“::”注译
- ECHO %VHD_ID% >"%VHD_DISK%\%VHDNAME%_引导ID.ini"
- :: 为方便操作在VHD所在路径中创建一个快速卸载此菜单项的脚本
- ECHO @ECHO OFF>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO ECHO.>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO ECHO. 请确认将卸载 %VHD_DISK%\%VHDNAME% !按任意键执行!>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO ECHO.>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO ECHO. 引导ID:%VHD_ID% >>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO ECHO.>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO Pause^>nul 2^>nul>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO bcdedit /delete %VHD_ID%>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO ECHO.>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO ECHO. 请查看当前有无错误,请按任意键退出!>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO Pause^>nul 2^>nul>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- ECHO DEL /F /Q "%%0">>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
- :: 安装到BCD引导菜单
- %BCDEDITS% /set %VHD_ID% device vhd=[%VHD_DISK%]\%VHDNAME%
- %BCDEDITS% /set %VHD_ID% path \windows\system32\boot\winload.exe
- %BCDEDITS% /set %VHD_ID% osdevice vhd=[%VHD_DISK%]\%VHDNAME%
- %BCDEDITS% /set %VHD_ID% systemroot \windows
- %BCDEDITS% /set %VHD_ID% nx optin
- %BCDEDITS% /set %VHD_ID% detecthal yes
- %BCDEDITS% /set %VHD_ID% locale "zh-CN"
- %BCDEDITS% /displayorder %VHD_ID% /addlast
- :: 保存当前所有引导项列表,如果您不需要此文件可以在其前面添加“::”注译
- %BCDEDITS% >"%VHD_DISK%\%VHDNAME%_引导列表预览.txt"
- :: 使用DiskPart脚本卸载当前的虚拟磁盘,如果您不希望现在卸载此VHD,可在以下两行中添加“::”注译
- diskpart /s UnVHDS
- choice /t 5 /d y /n
- :: 删除用过的临时文件
- DEL /F /Q InVHDS >nul 2>nul
- DEL /F /Q UnVHDS >nul 2>nul
- DEL /F /Q bcdtemp.txt >nul 2>nul
- DEL /F /Q vhdbootid.ini >nul 2>nul
- :: ########################################################################
- ECHO.
- ECHO. !!操作完成 !!
- ECHO.
- ECHO.
- ECHO. 启动菜单名:%VHDNAMES%
- ECHO.
- ECHO. 启动菜单ID:%VHD_ID%
- ECHO.
- ECHO. 执行 %VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD 可删除此安装!
- ECHO.
- ECHO. 还原可执行 %SystemDrive%\BOOT\BCD_Backup\[当前时间]\...引导菜单备份.CMD
- ECHO.
- ECHO.
- ECHO.
- Pause >nul
- explorer.exe %VHD_DISK%\
- EXIT
- :: ########################################################################
- :DoesNotVHD
- ECHO.
- ECHO.
- ECHO. 没找到以 %VHDNAME% 为名的VHD文件!
- ECHO.
- ECHO. 请确认此文件存在 !确认您输入的信息正确 !!!
- Pause >nul 2>nul
- CLS
- Set VHDNAME=
- Set VHDNAMES=
- SET VHD_DISK=
- SET BCDEDITS=
- SET VHDBOOTIDA=
- SET VHD_ID=
- SET VHD_WINS=
- SET VHDBOOTIDA=%%i
- SET VHD_ID=
- goto InVHDCMD
- :: ########################################################################
- :ON_VHDS
- DEL /F /Q InVHDS >nul 2>nul
- DEL /F /Q UnVHDS >nul 2>nul
- DEL /F /Q bcdtemp.txt >nul 2>nul
- DEL /F /Q vhdbootid.ini >nul 2>nul
- ECHO.
- ECHO.
- ECHO. %VHDNAME% 已在当前系统的启动引导列表中 !!!
- ECHO.
- ECHO. 没必要重复,您可以更改 %VHDNAME% 的名称 !!!
- ECHO.
- Pause >nul 2>nul
- CLS
- Set VHDNAME=
- Set VHDNAMES=
- SET VHD_DISK=
- SET BCDEDITS=
- SET VHDBOOTIDA=
- SET VHD_ID=
- SET VHD_WINS=
- SET VHDBOOTIDA=%%i
- SET VHD_ID=
- goto InVHDCMD
全自动安装VHD虚拟设备到BCD引导菜单_懒人代码.cmd
接二楼
附所有脚本包_已订正的包:
注意:刚刚发现一个问题,如果您下载了下面的 “VHD相关脚本.rar” 文件包,请手动修改“全自动安装VHD虚拟设备到BCD引导菜单_懒人代码.cmd”!在“:: 重置变量”下添加以下内容,参照以下代码:
也可参考2楼的 ……
- :: 重置变量
- SET EX=
- SET NAME***=
- SET VHD_PATH=
- SET VHD_DISK=
- SET VHDNAMEEXA=
- SET VHDNAMEEXB=
- SET VHD_ID=
- SET BCDEDITS=
- SET VHDBOOTIDA=
- SET VHD_WINS=
- SET VHD_ID=
- SET VHDBOOTIDA=
- :: 添加以下几行,刚才要还原BCD菜单时发现没能正常备份,因为没这几行,所以脚本无法正常创建备份目录
- :: 当前时间
- SET tm1=%time:~0,2%
- SET tm2=%time:~3,2%
- SET tm3=%time:~6,2%
上海IT外包服务网www.itshanghai.net