Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

搜索
查看: 13331|回复: 62

让你在 Windows 7 中更方便加载卸载及管理VHD功能的脚本 [复制链接]

Rank: 5Rank: 5Rank: 5

UID
103690
帖子
998
PB币
2090
贡献
0
技术
0
活跃
199
发表于 2009-7-4 12:40:20
本帖最后由 ZULGMG 于 2009-7-4 21:17 编辑

Windows 7 系统新功能多多,6月中下旬第一次安装使用远景的 Windows 7 7260 ,安装好后便开始摸索系统兼容性及各种新功能,Windows 7 还在开发期间便有网友传说 Windows 7 中的VHD功能,偶当时便开始胡思乱想能带来什么好处…… 经过近两周的摸索发现VHD这东东很不错, VHD在其它方面还应有更多的功能及用处,虽然某些功能尚未实现纯属本人胡思构想…… 但相信随着新版正式版将来版本的更新,其功能将更实用并在其它方面得以扩展……

在试用测试期间为了方便使用,偶写了几个脚本,现在拿出与大家分享:

共四个脚本:
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
  1. @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  2. CLS
  3. COLOR 2E
  4. MODE CON: COLS=56 LINES=23
  5. TITLE 正在加载VHD文件
  6. CLS

  7. :: 重置变量
  8. SET EX=
  9. SET NAMEEX=
  10. SET VHD_PATH=

  11. :: 获取操作信息
  12. if "%1"=="" GOTO :HELP_VHD
  13. if "%1"=="%~0" GOTO :LOAD_VHD
  14. if "%1"=="%~dp0%~n0%~x0" GOTO :LOAD_VHD

  15. :LOAD_VHD
  16. :: 得到文件路径完整信息
  17. SET VHD_PATH=%1
  18. GOTO SLOAD_VHD

  19. :SLOAD_VHD
  20. :: 获取VHD文件的路径名称等信息
  21. for /f "delims==" %%i in ("%VHD_PATH%") Do (
  22.        SET "NAMEEX=%%~nxi"
  23.        SET "EX=%%~xi"
  24. )
  25. if /i "%EX%" == ".VHD" (ECHO.&ECHO.正在加载 %VHD_PATH% …) ELSE GOTO :NO_VHD

  26. :: 写加载VHD的DiskPart脚本文件
  27. ECHO select vdisk file=%VHD_PATH%>InVHDS
  28. ECHO attach vdisk>>InVHDS
  29. ECHO list disk>>InVHDS

  30. :: 用DiskPart脚本加载VHD,完成后删除DiskPart脚本,退出!
  31. Diskpart /s InVHDS
  32. DEL /F /Q InVHDS
  33. EXIT

  34. :HELP_VHD
  35. COLOR 2E
  36. MODE CON: COLS=56 LINES=13
  37. TITLE 拖放您要加载的VHD文件到此 …
  38. ECHO.
  39. ECHO.
  40. ECHO. 请将您要加载的VHD文件拖放到本窗口中!然后按回车键!
  41. ECHO.
  42. ECHO.
  43. ECHO. 注意:VHD不要在带有空格的目录中,VHD文件名没有空格!
  44. ECHO.
  45. ECHO.
  46. SET VHD_PATH=
  47. SET /P VHD_PATH=

  48. COLOR 2E
  49. MODE CON: COLS=56 LINES=23
  50. TITLE 正在加载VHD文件
  51. CLS
  52. GOTO SLOAD_VHD

  53. :NO_VHD
  54. COLOR 4E
  55. MODE CON: COLS=56 LINES=13
  56. TITLE %VHD_PATH% 不是VHD文件 …
  57. ECHO.
  58. ECHO. !!!错误 !!!
  59. ECHO.
  60. ECHO.
  61. ECHO. 无法加载 %VHD_PATH%
  62. ECHO.
  63. ECHO. %NAMEEX% 不是VHD文件!!!
  64. ECHO.
  65. ECHO.
  66. ECHO. 请按任意键继续 ……
  67. ECHO.
  68. Pause >nul
  69. SET EX=
  70. SET NAMEEX=
  71. SET VHD_PATH=
  72. GOTO HELP_VHD
复制代码
卸载VHD.cmd
  1. @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  2. CLS
  3. COLOR 2E
  4. MODE CON: COLS=56 LINES=23
  5. TITLE 正在卸载VHD文件
  6. CLS
  7. :: 重置变量
  8. SET EX=
  9. SET NAMEEX=
  10. SET VHD_PATH=
  11. :: 获取操作信息
  12. if "%1"=="" GOTO :HELP_VHD
  13. if "%1"=="%~0" GOTO :UNINS_VHD
  14. if "%1"=="%~dp0%~n0%~x0" GOTO :UNINS_VHD
  15. :UNINS_VHD
  16. :: 得到文件路径完整信息
  17. SET VHD_PATH=%1
  18. GOTO SUNINS_VHD
  19. :SUNINS_VHD
  20. :: 获取VHD文件的路径名称等信息
  21. for /f "delims==" %%i in ("%VHD_PATH%") Do (
  22.        SET "NAMEEX=%%~nxi"
  23.        SET "EX=%%~xi"
  24. )
  25. if /i "%EX%" == ".VHD" (ECHO.&ECHO.正在加载 %VHD_PATH% …) ELSE GOTO :NO_VHD
  26. :: 写卸载VHD的DiskPart脚本文件
  27. ECHO select vdisk file=%VHD_PATH%>UnVHDS
  28. ECHO detach vdisk>>UnVHDS
  29. ECHO list disk>>UnVHDS
  30. ECHO select vdisk file=%VHD_PATH%>>UnVHDS
  31. ECHO detach vdisk>>UnVHDS
  32. :: 用DiskPart脚本卸载VHD,完成后删除DiskPart脚本,退出!
  33. Diskpart /s UnVHDS
  34. DEL /F /Q UnVHDS
  35. EXIT
  36. :HELP_VHD
  37. COLOR 2E
  38. MODE CON: COLS=56 LINES=13
  39. TITLE 拖放您要卸载的VHD文件到此 …
  40. ECHO.
  41. ECHO.
  42. ECHO.   请将您要加载的VHD文件拖放到本窗口中!然后按回车键!
  43. ECHO.
  44. ECHO.
  45. ECHO.   注意:VHD不要在带有空格的目录中,VHD文件名没有空格!
  46. ECHO.
  47. ECHO.
  48. SET VHD_PATH=
  49. SET /P VHD_PATH=
  50. COLOR 2E
  51. MODE CON: COLS=56 LINES=23
  52. TITLE 正在卸载VHD文件
  53. CLS
  54. GOTO SUNINS_VHD
  55. :NO_VHD
  56. COLOR 4E
  57. MODE CON: COLS=56 LINES=13
  58. TITLE %VHD_PATH% 不是VHD文件 …
  59. ECHO.
  60. ECHO.                    !!!错误 !!!
  61. ECHO.
  62. ECHO.
  63. ECHO.   无法卸载 %VHD_PATH%
  64. ECHO.
  65. ECHO.   %NAMEEX% 不是VHD文件!!!
  66. ECHO.
  67. ECHO.
  68. ECHO.   请按任意键继续 ……
  69. ECHO.
  70. Pause >nul
  71. SET EX=
  72. SET NAMEEX=
  73. SET VHD_PATH=
  74. GOTO HELP_VHD
复制代码


自定义安装VHD虚拟设备到BCD引导菜单.cmd
  1. @ECHO OFF
  2. COLOR 2E
  3. TITLE 安装与设置VHD虚拟磁盘
  4. CLS
  5. Set VHDNAME=
  6. Set VHDNAMES=
  7. SET VHD_DISK=
  8. SET BCDEDITS=
  9. SET VHDBOOTIDA=
  10. SET VHD_ID=
  11. SET VHD_WINS=
  12. SET VHDBOOTIDA=
  13. SET VHD_ID=
  14. :: 当前时间
  15. SET tm1=%time:~0,2%
  16. SET tm2=%time:~3,2%
  17. SET tm3=%time:~6,2%
  18. :InVHDCMD
  19. :: ########################################################################
  20. ECHO.
  21. ECHO.
  22. ECHO.        输入您的VHD文件名称,注意包括 .VHD 扩展名
  23. ECHO.
  24. ECHO.        您的 VHD 文件名最好不要带空格,!可能出错 !
  25. ECHO.
  26. ECHO.        如果带路径请输入,例如: VHD\Windows7\Windows7.vhd (不要带盘符与\号)
  27. ECHO.
  28. ECHO.
  29. Set VHDNAME=
  30. Set /P VHDNAME=输入VHD全名, 然后回车 :
  31. :: ########################################################################
  32. ECHO.
  33. ECHO.
  34. ECHO.        输入您希望显示的启动菜单名称,即启动列表中显示的名称!
  35. ECHO.
  36. ECHO.        例如:Windows 7 VHD 虚拟机系统
  37. ECHO.
  38. ECHO.
  39. Set VHDNAMES=
  40. Set /P VHDNAMES=输入VHD全名, 然后回车 :
  41. :: ########################################################################
  42. :: 全盘搜索用户输入的VHD文件
  43. 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 (
  44.       if exist %%a\%VHDNAME% SET VHD_DISK=%%a
  45. )
  46. :: 如果没有找到VHD文件,反馈信息给用户
  47. if not exist %VHD_DISK%\%VHDNAME% goto DoesNotVHD
  48. :: ########################################################################
  49. :: 给脚本当前bcdedit文件位置,重置VHDBOOTIDA及VHD_ID变量
  50. SET BCDEDITS=%SystemRoot%\system32\bcdedit.exe
  51. SET VHDBOOTIDA=
  52. SET VHD_ID=
  53. :: 获取当前启动菜单列表,并搜索当前项目是否已安装
  54. %BCDEDITS% >bcdtemp.txt
  55. TYPE bcdtemp.txt | find "\%VHDNAME%" >nul && goto ON_VHDS
  56. :: ########################################################################
  57. :: 找到VHD,写VHD的安装DiskPart脚本文件
  58. ECHO select vdisk file=%VHD_DISK%\%VHDNAME%>InVHDS
  59. ECHO attach vdisk>>InVHDS
  60. :: 写VHD的卸载DiskPart脚本文件
  61. ECHO select vdisk file=%VHD_DISK%\%VHDNAME%>UnVHDS
  62. ECHO detach vdisk>>UnVHDS
  63. ECHO list disk>>UnVHDS
  64. ECHO select vdisk file=%VHD_DISK%\%VHDNAME%>>UnVHDS
  65. ECHO detach vdisk>>UnVHDS
  66. :: 使用DiskPart脚本安装当前的虚拟磁盘
  67. diskpart /s InVHDS
  68. choice /t 5 /d y /n
  69. :: ########################################################################
  70. :: 备份启动引导BCD菜单文件,以备还原时用
  71. :: 备份到[系统盘:\BOOT\BCD_Backup\当前时间日期\]
  72. :: 到BCD备份目录中执行“还原此文件包中的引导菜单备份.CMD”即可还原以下备份
  73. if not exist "%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分" MD "%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分"
  74. %BCDEDITS% /export "%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\BCD_Backup"
  75. :: 创建一个还原当前BCD备份的脚本
  76. ECHO @ECHO OFF>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  77. ECHO ECHO.>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  78. ECHO SET ADIRS=%%~dp0>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  79. ECHO SET BCDEDITS=%%SystemRoot%%\system32\bcdedit.exe>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  80. ECHO ECHO.>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  81. ECHO %%BCDEDITS%% /import "%%ADIRS%%BCD_Backup">>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  82. ECHO ECHO.>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  83. ECHO ECHO.   请查看当前有无错误,请按任意键退出!>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  84. ECHO Pause^>nul 2^>nul>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  85. :: ########################################################################
  86. :: 获取已加载的VHD盘符目录,如果已安装系统则复制VHD系统引导信息到当前系统
  87. 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 (
  88.       if exist %%b\Windows\System32\bcdboot.exe SET VHD_WINS=%%b
  89. )
  90. if not exist %VHD_WINS%\Windows\System32\bcdboot.exe goto NotVHDWINS
  91. :: 当前系统文件及VHD中系统文件变量
  92. SET SYSA=%SystemRoot%\system32\bcdboot.exe
  93. SET SYSV=%VHD_WINS%\Windows\System32\bcdboot.exe
  94. :: 如果搜索到是当前系统中的bcdboot.exe,则跳过从VHD中复制引导信息到当前系统的指令
  95. if /i "%SYSA%" == "%SYSV%" (ECHO.&ECHO.VHD中没有安装操作系统 …&ECHO.&ECHO.跳过从VHD中复制引导信息 …&GOTO NotVHDWINS) ELSE ECHO.&ECHO.从VHD系统中复制引导信息到当前系统 …
  96. ECHO.
  97. CD %VHD_WINS%\Windows\System32
  98. bcdboot %VHD_WINS%\Windows /s %SYSTEMDRIVE%

  99. :: ########################################################################
  100. :NotVHDWINS
  101. :: 为当前项目创建一个ID,输出文本并去掉{}前后无用字串
  102. %BCDEDITS% /create %VHD_ID% /d "%VHDNAMES%" /application osloader >vhdbootid.ini
  103. for,/f,"tokens=2 delims={",%%i,In (vhdbootid.ini) Do (
  104.      SET VHDBOOTIDA=%%i
  105. )
  106. for,/f,"tokens=1 delims=}",%%i,In ("%VHDBOOTIDA%") Do (
  107.      SET VHD_ID={%%i}
  108. )
  109. :: 输出记录当前项目ID以便备后用,如果您不需要此文件可以在其前面添加“::”注译
  110. ECHO %VHD_ID% >"%VHD_DISK%\%VHDNAME%_引导ID.ini"
  111. :: 为方便操作在VHD所在路径中创建一个快速卸载此菜单项的脚本
  112. ECHO @ECHO OFF>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  113. ECHO ECHO.>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  114. ECHO ECHO.   请确认将卸载 %VHD_DISK%\%VHDNAME% !按任意键执行!>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  115. ECHO ECHO.>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  116. ECHO ECHO.   引导ID:%VHD_ID% >>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  117. ECHO ECHO.>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  118. ECHO Pause^>nul 2^>nul>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  119. ECHO bcdedit /delete %VHD_ID%>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  120. ECHO ECHO.>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  121. ECHO ECHO.   请查看当前有无错误,请按任意键退出!>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  122. ECHO Pause^>nul 2^>nul>>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  123. ECHO DEL /F /Q "%%0">>"%VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD"
  124. :: 安装到BCD引导菜单
  125. %BCDEDITS% /set %VHD_ID% device vhd=[%VHD_DISK%]\%VHDNAME%
  126. %BCDEDITS% /set %VHD_ID% path \windows\system32\boot\winload.exe
  127. %BCDEDITS% /set %VHD_ID% osdevice vhd=[%VHD_DISK%]\%VHDNAME%
  128. %BCDEDITS% /set %VHD_ID% systemroot \windows
  129. %BCDEDITS% /set %VHD_ID% nx optin
  130. %BCDEDITS% /set %VHD_ID% detecthal yes
  131. %BCDEDITS% /set %VHD_ID% locale "zh-CN"
  132. %BCDEDITS% /displayorder %VHD_ID% /addlast

  133. :: 保存当前所有引导项列表,如果您不需要此文件可以在其前面添加“::”注译
  134. %BCDEDITS% >"%VHD_DISK%\%VHDNAME%_引导列表预览.txt"
  135. :: 使用DiskPart脚本卸载当前的虚拟磁盘,如果您不希望现在卸载此VHD,可在以下两行中添加“::”注译
  136. diskpart /s UnVHDS
  137. choice /t 5 /d y /n
  138. :: 删除用过的临时文件
  139. DEL /F /Q InVHDS >nul 2>nul
  140. DEL /F /Q UnVHDS >nul 2>nul
  141. DEL /F /Q bcdtemp.txt >nul 2>nul
  142. DEL /F /Q vhdbootid.ini >nul 2>nul
  143. :: ########################################################################
  144. ECHO.
  145. ECHO.                                !!操作完成 !!
  146. ECHO.
  147. ECHO.
  148. ECHO.        启动菜单名:%VHDNAMES%
  149. ECHO.
  150. ECHO.        启动菜单ID:%VHD_ID%
  151. ECHO.
  152. ECHO.        执行 %VHD_DISK%\%VHDNAME%_卸载引导菜单.CMD 可删除此安装!
  153. ECHO.
  154. ECHO.        还原可执行 %SystemDrive%\BOOT\BCD_Backup\[当前时间]\...引导菜单备份.CMD
  155. ECHO.
  156. ECHO.
  157. ECHO.
  158. Pause >nul
  159. explorer.exe %VHD_DISK%\
  160. EXIT
  161. :: ########################################################################
  162. :DoesNotVHD
  163. ECHO.
  164. ECHO.
  165. ECHO.        没找到以 %VHDNAME% 为名的VHD文件!
  166. ECHO.
  167. ECHO.        请确认此文件存在 !确认您输入的信息正确 !!!
  168. Pause >nul 2>nul
  169. CLS
  170. Set VHDNAME=
  171. Set VHDNAMES=
  172. SET VHD_DISK=
  173. SET BCDEDITS=
  174. SET VHDBOOTIDA=
  175. SET VHD_ID=
  176. SET VHD_WINS=
  177. SET VHDBOOTIDA=%%i
  178. SET VHD_ID=
  179. goto InVHDCMD
  180. :: ########################################################################
  181. :ON_VHDS
  182. DEL /F /Q InVHDS >nul 2>nul
  183. DEL /F /Q UnVHDS >nul 2>nul
  184. DEL /F /Q bcdtemp.txt >nul 2>nul
  185. DEL /F /Q vhdbootid.ini >nul 2>nul
  186. ECHO.
  187. ECHO.
  188. ECHO.        %VHDNAME% 已在当前系统的启动引导列表中 !!!
  189. ECHO.
  190. ECHO.        没必要重复,您可以更改 %VHDNAME% 的名称 !!!
  191. ECHO.
  192. Pause >nul 2>nul
  193. CLS
  194. Set VHDNAME=
  195. Set VHDNAMES=
  196. SET VHD_DISK=
  197. SET BCDEDITS=
  198. SET VHDBOOTIDA=
  199. SET VHD_ID=
  200. SET VHD_WINS=
  201. SET VHDBOOTIDA=%%i
  202. SET VHD_ID=
  203. goto InVHDCMD
复制代码


全自动安装VHD虚拟设备到BCD引导菜单_懒人代码.cmd

接二楼


附所有脚本包_已订正的包: VHD相关的脚本包_已全部修订.rar (193.75 KB, 下载次数: 483)
注意:刚刚发现一个问题,如果您下载了下面的 “VHD相关脚本.rar” 文件包,请手动修改“全自动安装VHD虚拟设备到BCD引导菜单_懒人代码.cmd”!在“:: 重置变量”下添加以下内容,参照以下代码:

也可参考2楼的 ……

  1. :: 重置变量
  2. SET EX=
  3. SET NAME***=
  4. SET VHD_PATH=
  5. SET VHD_DISK=
  6. SET VHDNAMEEXA=
  7. SET VHDNAMEEXB=
  8. SET VHD_ID=
  9. SET BCDEDITS=
  10. SET VHDBOOTIDA=
  11. SET VHD_WINS=
  12. SET VHD_ID=
  13. SET VHDBOOTIDA=
  14. :: 添加以下几行,刚才要还原BCD菜单时发现没能正常备份,因为没这几行,所以脚本无法正常创建备份目录
  15. :: 当前时间
  16. SET tm1=%time:~0,2%
  17. SET tm2=%time:~3,2%
  18. SET tm3=%time:~6,2%
复制代码



VHD相关脚本.rar

166.4 KB, 下载次数: 41, 下载积分: PB币 -1

此包为旧文件,请下载上面已修订的包

VHD的相关脚本.rar

193.55 KB, 下载次数: 75, 下载积分: PB币 -1

此包为旧文件,请下载上面已修订的包

6

查看全部评分

Rank: 5Rank: 5Rank: 5

UID
103690
帖子
998
PB币
2090
贡献
0
技术
0
活跃
199
发表于 2009-7-4 12:40:49
本帖最后由 ZULGMG 于 2009-7-4 17:43 编辑

全自动安装VHD虚拟设备到BCD引导菜单_懒人代码.cmd

  1. @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  2. COLOR 2E
  3. MODE CON: COLS=56 LINES=23
  4. TITLE 正在加载VHD文件
  5. CLS
  6. :: 重置变量
  7. SET EX=
  8. SET NAME***=
  9. SET VHD_PATH=
  10. SET VHD_DISK=
  11. SET VHDNAMEEXA=
  12. SET VHDNAMEEXB=
  13. SET VHD_ID=
  14. SET BCDEDITS=
  15. SET VHDBOOTIDA=
  16. SET VHD_WINS=
  17. SET VHD_ID=
  18. SET VHDBOOTIDA=

  19. SET tm1=%time:~0,2%
  20. SET tm2=%time:~3,2%
  21. SET tm3=%time:~6,2%

  22. :: ########################################################################
  23. :: 获取操作信息
  24. if "%1"=="" GOTO :HELP_VHD
  25. if "%1"=="%~0" GOTO :LOAD_VHD
  26. if "%1"=="%~dp0%~n0%~x0" GOTO :LOAD_VHD
  27. :LOAD_VHD
  28. :: 得到文件路径完整信息
  29. SET VHD_PATH=%1
  30. GOTO SLOAD_VHD
  31. :SLOAD_VHD
  32. :: 获取VHD文件的路径名称等信息
  33. for /f "delims==" %%i in ("%VHD_PATH%") Do (
  34.        SET "VHD_DISK=%%~di"
  35.        SET "VHDNAMEEXA=%%~ni"
  36.        SET "VHDNAMEEXB=%%~nxi"
  37.        SET "NAME***=%%~pi%%~nxi"
  38.        SET "EX=%%~xi"
  39. )
  40. if /i "%EX%" == ".VHD" (ECHO.&ECHO.正在加载 %VHD_PATH% …) ELSE GOTO :NO_VHD
  41. :: ########################################################################
  42. :: 给脚本当前bcdedit文件位置
  43. SET BCDEDITS=%SystemRoot%\system32\bcdedit.exe
  44. SET VHDBOOTIDA=
  45. SET VHD_ID=
  46. :: 获取当前启动菜单列表,并搜索当前项目是否已安装
  47. %BCDEDITS% >bcdtemp.txt
  48. TYPE bcdtemp.txt | find "%NAME***%" >nul && goto ON_VHDS

  49. :: ########################################################################
  50. :: 写VHD的安装DiskPart脚本文件
  51. ECHO select vdisk file=%VHD_PATH%>InVHDS
  52. ECHO attach vdisk>>InVHDS
  53. :: 写VHD的卸载DiskPart脚本文件
  54. ECHO select vdisk file=%VHD_PATH%>UnVHDS
  55. ECHO detach vdisk>>UnVHDS
  56. ECHO list disk>>UnVHDS
  57. ECHO select vdisk file=%VHD_PATH%>>UnVHDS
  58. ECHO detach vdisk>>UnVHDS
  59. :: 使用DiskPart脚本安装当前的虚拟磁盘,某些机器比较慢,所以需要延长一些时间
  60. diskpart /s InVHDS
  61. choice /t 5 /d y /n
  62. :: ########################################################################
  63. :: 备份启动引导BCD菜单文件,以备还原时用
  64. :: 备份到[系统盘:\BOOT\BCD_Backup\当前时间日期\]
  65. :: 到BCD备份目录中执行“还原此文件包中的引导菜单备份.CMD”即可还原以下备份
  66. if not exist "%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分" MD "%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分"
  67. %BCDEDITS% /export "%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\BCD_Backup"
  68. :: 创建一个还原当前BCD备份的脚本
  69. ECHO @ECHO OFF>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  70. ECHO ECHO.>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  71. ECHO SET ADIRS=%%~dp0>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  72. ECHO SET BCDEDITS=%%SystemRoot%%\system32\bcdedit.exe>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  73. ECHO ECHO.>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  74. ECHO %%BCDEDITS%% /import "%%ADIRS%%BCD_Backup">>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  75. ECHO ECHO.>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  76. ECHO ECHO.   请查看当前有无错误,请按任意键退出!>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  77. ECHO Pause^>nul 2^>nul>>"%SystemDrive%\BOOT\BCD_Backup\%date:~0,10%\%tm1%点%tm2%分\还原此文件包中的引导菜单备份.CMD"
  78. :: ########################################################################
  79. :: 获取已加载的VHD盘符目录,如果已安装系统则复制VHD系统引导信息到当前系统
  80. 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 (
  81.       if exist %%b\Windows\System32\bcdboot.exe SET VHD_WINS=%%b
  82. )
  83. if not exist %VHD_WINS%\Windows\System32\bcdboot.exe goto NotVHDWINS
  84. :: 当前系统文件及VHD中系统文件变量
  85. SET SYSA=%SystemRoot%\system32\bcdboot.exe
  86. SET SYSV=%VHD_WINS%\Windows\System32\bcdboot.exe
  87. :: 如果搜索到是当前系统中的bcdboot.exe,则跳过从VHD中复制启动到当前系统的指令
  88. if /i "%SYSA%" == "%SYSV%" (ECHO.&ECHO.VHD中没有安装操作系统 …&ECHO.&ECHO.跳过从VHD中复制引导信息 …&GOTO NotVHDWINS) ELSE ECHO.&ECHO.从VHD系统中复制引导信息到当前系统 …
  89. ECHO.
  90. CD %VHD_WINS%\Windows\System32
  91. bcdboot %VHD_WINS%\Windows /s %SYSTEMDRIVE%

  92. :: ########################################################################
  93. :NotVHDWINS
  94. :: 为当前项目创建一个ID,输出文本并去掉{}前后无用字串
  95. %BCDEDITS% /create %VHD_ID% /d "%VHDNAMEEXA% 虚拟设备驱动器" /application osloader >vhdbootid.ini
  96. for,/f,"tokens=2 delims={",%%i,In (vhdbootid.ini) Do (
  97.      SET VHDBOOTIDA=%%i
  98. )
  99. for,/f,"tokens=1 delims=}",%%i,In ("%VHDBOOTIDA%") Do (
  100.      SET VHD_ID={%%i}
  101. )
  102. :: 输出记录当前项目ID以便备后用,如果您不需要此文件可以在其前面添加“::”注译
  103. ECHO %VHD_ID% >"%VHD_PATH%_引导ID.ini"
  104. :: 为方便操作在VHD所在路径中创建一个快速卸载此菜单项的脚本
  105. ECHO @ECHO OFF>"%VHD_PATH%_卸载引导菜单.CMD"
  106. ECHO ECHO.>>"%VHD_PATH%_卸载引导菜单.CMD"
  107. ECHO ECHO.   请确认将卸载 %VHD_PATH% !按任意键执行!>>"%VHD_PATH%_卸载引导菜单.CMD"
  108. ECHO ECHO.>>"%VHD_PATH%_卸载引导菜单.CMD"
  109. ECHO ECHO.   引导ID:%VHD_ID% >>"%VHD_PATH%_卸载引导菜单.CMD"
  110. ECHO ECHO.>>"%VHD_PATH%_卸载引导菜单.CMD"
  111. ECHO Pause^>nul 2^>nul>>"%VHD_PATH%_卸载引导菜单.CMD"
  112. ECHO bcdedit /delete %VHD_ID%>>"%VHD_PATH%_卸载引导菜单.CMD"
  113. ECHO ECHO.>>"%VHD_PATH%_卸载引导菜单.CMD"
  114. ECHO ECHO.   请查看当前有无错误,请按任意键退出!>>"%VHD_PATH%_卸载引导菜单.CMD"
  115. ECHO Pause^>nul 2^>nul>>"%VHD_PATH%_卸载引导菜单.CMD"
  116. ECHO DEL /F /Q "%%0">>"%VHD_PATH%_卸载引导菜单.CMD"
  117. :: 安装到BCD引导菜单
  118. %BCDEDITS% /set %VHD_ID% device vhd=[%VHD_DISK%]%NAME***%
  119. %BCDEDITS% /set %VHD_ID% path \windows\system32\boot\winload.exe
  120. %BCDEDITS% /set %VHD_ID% osdevice vhd=[%VHD_DISK%]%NAME***%
  121. %BCDEDITS% /set %VHD_ID% systemroot \windows
  122. %BCDEDITS% /set %VHD_ID% nx optin
  123. %BCDEDITS% /set %VHD_ID% detecthal yes
  124. %BCDEDITS% /set %VHD_ID% locale "zh-CN"
  125. %BCDEDITS% /displayorder %VHD_ID% /addlast
  126. :: 保存当前所有引导项列表,如果您不需要此文件可以在其前面添加“::”注译
  127. %BCDEDITS% >"%VHD_PATH%_引导列表预览.txt"
  128. :: 使用DiskPart脚本卸载当前的虚拟磁盘,如果您不希望现在卸载此VHD,可在以下两行中添加“::”注译
  129. diskpart /s UnVHDS
  130. choice /t 5 /d y /n
  131. :: 删除用过的临时文件
  132. DEL /F /Q InVHDS >nul 2>nul
  133. DEL /F /Q UnVHDS >nul 2>nul
  134. DEL /F /Q bcdtemp.txt >nul 2>nul
  135. DEL /F /Q vhdbootid.ini >nul 2>nul
  136. :: ########################################################################
  137. COLOR 2E
  138. MODE CON: COLS=80 LINES=25
  139. ECHO.
  140. ECHO.                                !!操作完成 !!
  141. ECHO.
  142. ECHO.
  143. ECHO.        启动菜单名:%VHDNAMEEXA% 虚拟设备驱动器
  144. ECHO.
  145. ECHO.        启动菜单ID:%VHD_ID%
  146. ECHO.
  147. ECHO.        执行 %VHD_PATH%_卸载引导菜单.CMD 可删除此安装!
  148. ECHO.
  149. ECHO.        还原可执行 %SystemDrive%\BOOT\BCD_Backup\[当前时间]\...引导菜单备份.CMD
  150. ECHO.
  151. ECHO.
  152. ECHO.
  153. Pause >nul
  154. EXIT
  155. :: ########################################################################
  156. :HELP_VHD
  157. COLOR 2E
  158. MODE CON: COLS=56 LINES=13
  159. TITLE 拖放您要加载的VHD文件到此 …
  160. ECHO.
  161. ECHO.
  162. ECHO.   请将您要加载的VHD文件拖放到本窗口中!然后按回车键!
  163. ECHO.
  164. ECHO.
  165. ECHO.   注意:VHD不要在带有空格的目录中,VHD文件名没有空格!
  166. ECHO.
  167. ECHO.
  168. SET VHD_PATH=
  169. SET /P VHD_PATH=
  170. COLOR 2E
  171. MODE CON: COLS=56 LINES=23
  172. TITLE 正在加载VHD文件
  173. CLS
  174. GOTO SLOAD_VHD
  175. :: ########################################################################
  176. :NO_VHD
  177. COLOR 4E
  178. MODE CON: COLS=56 LINES=13
  179. TITLE %VHD_PATH% 不是VHD文件 …
  180. ECHO.
  181. ECHO.                    !!!错误 !!!
  182. ECHO.
  183. ECHO.
  184. ECHO.   无法加载 %VHD_PATH%
  185. ECHO.
  186. ECHO.   %VHDNAMEEXB% 不是VHD文件!!!
  187. ECHO.
  188. ECHO.
  189. ECHO.   请按任意键继续 ……
  190. ECHO.
  191. Pause >nul
  192. SET EX=
  193. SET NAME***=
  194. SET VHD_PATH=
  195. SET VHD_DISK=
  196. SET VHDNAMEEXA=
  197. SET VHDNAMEEXB=
  198. SET VHD_ID=
  199. SET BCDEDITS=
  200. SET VHDBOOTIDA=
  201. SET VHD_WINS=
  202. SET VHD_ID=
  203. SET VHDBOOTIDA=
  204. GOTO HELP_VHD
  205. :: ########################################################################
  206. :ON_VHDS
  207. DEL /F /Q InVHDS >nul 2>nul
  208. DEL /F /Q UnVHDS >nul 2>nul
  209. DEL /F /Q bcdtemp.txt >nul 2>nul
  210. DEL /F /Q vhdbootid.ini >nul 2>nul
  211. COLOR 4E
  212. MODE CON: COLS=56 LINES=13
  213. TITLE %NAME***% 已存在 …
  214. ECHO.
  215. ECHO.
  216. ECHO.   %NAME***% 已在启动引导列表中 !!!
  217. ECHO.
  218. ECHO.   或者更改 %NAME***% 的名称 !!!
  219. ECHO.
  220. ECHO.
  221. Pause >nul
  222. SET EX=
  223. SET NAME***=
  224. SET VHD_PATH=
  225. SET VHD_DISK=
  226. SET VHDNAMEEXA=
  227. SET VHDNAMEEXB=
  228. SET VHD_ID=
  229. SET BCDEDITS=
  230. SET VHDBOOTIDA=
  231. SET VHD_WINS=
  232. SET VHD_ID=
  233. SET VHDBOOTIDA=
  234. GOTO HELP_VHD
复制代码


注意:Diskpart 命令不能在带有中文名称的目录中执行!另外本脚本不支持在带有空格的目录中运行,这个以后再完善了…… 因此注意不要在带有中文与空格的目录中运行!


附:所有脚本包在一楼!注意看下载说明,包内容修改!!!
2

查看全部评分

Rank: 2Rank: 2

UID
437736
帖子
327
PB币
419
贡献
0
技术
0
活跃
200
发表于 2009-7-4 13:44:48
好东西,坚决要支持一下,呵呵。我的系统是安装在VHD里边的,所以每次换系统时都要自己手动操作(技术水平不够,不会写CMD,哈哈)

Rank: 2Rank: 2

UID
38215
帖子
164
PB币
1823
贡献
0
技术
0
活跃
143
发表于 2009-7-4 13:48:49
技术帖,支持楼主,努力学习ING

Rank: 5Rank: 5Rank: 5

UID
366169
帖子
599
PB币
701
贡献
0
技术
0
活跃
19
发表于 2009-7-4 14:39:02
还没有用过vhd
头像被屏蔽

Rank: 5Rank: 5Rank: 5

UID
724756
帖子
774
PB币
0
贡献
0
技术
0
活跃
1
发表于 2009-7-4 14:55:41
提示: 作者被禁止或删除 内容自动屏蔽

Rank: 5Rank: 5Rank: 5

UID
284123
帖子
1155
PB币
1618
贡献
0
技术
2
活跃
1337
发表于 2009-7-4 15:12:44
大力支持,辛苦了。pb89

Rank: 2Rank: 2

UID
865957
帖子
156
PB币
199
贡献
0
技术
1
活跃
11
发表于 2009-7-4 16:02:09
辛苦了!!

Rank: 5Rank: 5Rank: 5

UID
103690
帖子
998
PB币
2090
贡献
0
技术
0
活跃
199
发表于 2009-7-4 17:40:58
本帖最后由 ZULGMG 于 2009-7-4 23:06 编辑

有朋友担心,如果VHD中没有安装操作系统,以上的脚本会复制当前系统自身引导信息到BCD,其实这个担心没有必要,以上脚本中的以下内容不执行一样能正常在BCD中创建VHD的引导:
  1. CD %VHD_WINS%\Windows\System32
  2. bcdboot %VHD_WINS%\Windows /s %SYSTEMDRIVE%
复制代码
如果已经下载了包文件的朋友担心以上情况,可将代码修改为如下,[其实以下内容不写一样能正常安装启动您的VHD]:pb54
  1. :: #####################################################################
  2. :: 获取已加载的VHD盘符目录,如果已安装系统则复制VHD系统引导信息到当前系统
  3. 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 (
  4.       if exist %%b\Windows\System32\bcdboot.exe SET VHD_WINS=%%b
  5. )
  6. if not exist %VHD_WINS%\Windows\System32\bcdboot.exe goto NotVHDWINS
  7. :: 当前系统文件及VHD中系统文件变量
  8. SET SYSA=%SystemRoot%\system32\bcdboot.exe
  9. SET SYSV=%VHD_WINS%\Windows\System32\bcdboot.exe
  10. :: 如果搜索到是当前系统中的bcdboot.exe,则跳过从VHD中复制引导信息到当前系统的指令
  11. if /i "%SYSA%" == "%SYSV%" (ECHO.&ECHO.VHD中没有安装操作系统 …&ECHO.&ECHO.跳过从VHD中复制引导信息 …&GOTO NotVHDWINS) ELSE ECHO.&ECHO.从VHD系统中复制引导信息到当前系统 …
  12. ECHO.
  13. CD %VHD_WINS%\Windows\System32
  14. bcdboot %VHD_WINS%\Windows /s %SYSTEMDRIVE%
  15. :: #####################################################################
复制代码

呵呵

Rank: 9

UID
208210
帖子
3845
PB币
5552
贡献
0
技术
1
活跃
172
发表于 2009-7-4 17:42:09
太深了,路过

Rank: 1

UID
327187
帖子
102
PB币
1570
贡献
0
技术
0
活跃
32
发表于 2009-7-4 18:50:24
太好了!非常棒!

Rank: 11Rank: 11Rank: 11

UID
824349
帖子
5637
PB币
2507
贡献
0
技术
44
活跃
98
发表于 2009-7-4 18:58:28
感谢楼主分享,谢谢
头像被屏蔽

Rank: 2Rank: 2

UID
639533
帖子
355
PB币
0
贡献
0
技术
0
活跃
9
发表于 2009-7-4 19:02:07
提示: 作者被禁止或删除 内容自动屏蔽

Rank: 5Rank: 5Rank: 5

UID
32105
帖子
1152
PB币
0
贡献
0
技术
0
活跃
816
发表于 2009-7-4 22:30:35
楼主了不起,顶一下!!!!

扫黄打非。

Rank: 9

UID
624463
帖子
3982
PB币
10270
贡献
0
技术
1
活跃
315
发表于 2009-7-5 00:07:11
好贴,楼主真是无私啊,谢谢了

小学生

Rank: 11Rank: 11Rank: 11

UID
71938
帖子
10223
PB币
22932
贡献
0
技术
60
活跃
1379

8周年庆典勋章

发表于 2009-7-5 00:14:10
很好的文章,顶上去!

Rank: 2Rank: 2

UID
38215
帖子
164
PB币
1823
贡献
0
技术
0
活跃
143
发表于 2009-7-5 00:24:34
楼主很勤奋,又更新了啊,顶一下

Rank: 2Rank: 2

UID
612561
帖子
391
PB币
506
贡献
0
技术
0
活跃
14
发表于 2009-7-5 01:25:14
高深的技术,还是不懂,学习了,消化中!
头像被屏蔽

Rank: 1

UID
104542
帖子
41
PB币
0
贡献
0
技术
0
活跃
1
发表于 2009-7-7 15:52:17
提示: 作者被禁止或删除 内容自动屏蔽

将军

Rank: 7Rank: 7Rank: 7

UID
128027
帖子
1354
PB币
5741
贡献
0
技术
0
活跃
482
发表于 2009-7-8 16:46:59
深~~~~~~~~深~~~~~~~~~太深奥了!
关闭

站长推荐

推荐好友加入远景可拿奖励
推荐好友进远景,可以拿3重奖励,PBB,威望,勋章,通通有~ 本帖只限回复推荐用
回顶部
Copyright (C) 2005-2018 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛 | 电脑硬件 | 安卓软件