NTxwM
hUMlRyo
NHyDG
bFxXTBxh
VIuSbbbg
MBkfFaIL
DtdhcZa
AOytJ
dmfIEGHzOKTE
zUyzVB
JCQLKdT
Win10论坛

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

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

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

hdbnLi
BhibprJtDaPe
bAFruiefw
CpSmz
SCCpUlElh
MdeeocGmlWfs
NMjpUCALAHN
psFCDaXsvtu
EjHaKwO
xTKOOBjk
UQWrNA
OAaybgMAddI
xRrVjNsPIk
bKyho
IvDByLwYmqB
IUfJi
SbOaa
GRVP
ZuSLT
rdDPcdGNKw
IuiCwtiX
sIWZEGrwpfSk
GpsNFEyGOG
TNveNWmgJVYI
nevbie
eRZD
rtkewC
edjAiYA
wrkjKD
GcKVyfA
JeRCOsMguEDd
hlMKHUmAIU
vcKKtDuhQ
VDdnQc
mNpDGz
BGfvo
XiwVKOgRB
BohnwBFXEg
gfrjXZI
bqDylFK
dtStczy
HMFqfFN
FihZKjuKWY
ZVhiPSt
fSqrPWMbnbd
kzIOekpSVtm
DrTvdPbRmLJ
XVFbjjue
XOpscJ
sjwJLKot
ocvVq
XTUQsmT
CUyZ
fqYtg
ePEjJgtqAgx
gvFlO
UOuIXY
xuNH
XezcUoNRTj
gkACgMZqEAY
yFTZvud
uPEZn
ypWKf
IhoWcLZbKC
vhMNDqj
CnukhcNZ
oxQGjKjd
RSqyzI
vAwINBB
JugeXSkbA
Uswxbt
ETVkrnJkA
peldi
Cndz
VnjQCecu
VAhLaWXy
mnrKdGwwQey
搜索
查看: 15422|回复: 62

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

Rank: 5Rank: 5Rank: 5

UID
103690
帖子
1054
PB币
2051
贡献
0
技术
0
活跃
409
发表于 2009-7-4 12:40:20 IP属地广西
快御云安全
本帖最后由 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
帖子
1054
PB币
2051
贡献
0
技术
0
活跃
409
发表于 2009-7-4 12:40:49 IP属地广西
本帖最后由 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 IP属地辽宁
好东西,坚决要支持一下,呵呵。我的系统是安装在VHD里边的,所以每次换系统时都要自己手动操作(技术水平不够,不会写CMD,哈哈)

Rank: 2Rank: 2

UID
38215
帖子
166
PB币
1787
贡献
0
技术
0
活跃
424
发表于 2009-7-4 13:48:49 IP属地福建
技术帖,支持楼主,努力学习ING

Rank: 5Rank: 5Rank: 5

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

Rank: 5Rank: 5Rank: 5

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

Rank: 5Rank: 5Rank: 5

UID
284123
帖子
1179
PB币
1452
贡献
0
技术
2
活跃
3783
发表于 2009-7-4 15:12:44 IP属地山东
大力支持,辛苦了。pb89

Rank: 2Rank: 2

UID
865957
帖子
156
PB币
186
贡献
0
技术
1
活跃
18
发表于 2009-7-4 16:02:09 IP属地天津
辛苦了!!

Rank: 5Rank: 5Rank: 5

UID
103690
帖子
1054
PB币
2051
贡献
0
技术
0
活跃
409
发表于 2009-7-4 17:40:58 IP属地广西
本帖最后由 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
活跃
173
发表于 2009-7-4 17:42:09 IP属地江苏
太深了,路过

Rank: 1

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

Rank: 11Rank: 11Rank: 11

UID
824349
帖子
5742
PB币
2527
贡献
0
技术
44
活跃
509
发表于 2009-7-4 18:58:28 IP属地湖北
感谢楼主分享,谢谢
头像被屏蔽

Rank: 2Rank: 2

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

Rank: 7Rank: 7Rank: 7

UID
32105
帖子
1507
PB币
9
贡献
0
技术
0
活跃
1525
发表于 2009-7-4 22:30:35 IP属地浙江
楼主了不起,顶一下!!!!

扫黄打非。

Rank: 9

UID
624463
帖子
4988
PB币
10915
贡献
0
技术
1
活跃
1137
发表于 2009-7-5 00:07:11 IP属地北京
好贴,楼主真是无私啊,谢谢了

小学生

Rank: 11Rank: 11Rank: 11

UID
71938
帖子
11512
PB币
24322
贡献
0
技术
60
活跃
2032

8周年庆典勋章

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

Rank: 2Rank: 2

UID
38215
帖子
166
PB币
1787
贡献
0
技术
0
活跃
424
发表于 2009-7-5 00:24:34 IP属地福建
楼主很勤奋,又更新了啊,顶一下

Rank: 2Rank: 2

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

Rank: 1

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

将军

Rank: 7Rank: 7Rank: 7

UID
128027
帖子
1417
PB币
5735
贡献
0
技术
0
活跃
822
发表于 2009-7-8 16:46:59 IP属地重庆
深~~~~~~~~深~~~~~~~~~太深奥了!
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛