积分 452 最后登录 2024-3-19 精华 0 阅读权限 30 主题 26 UID 103690 帖子 1054 PB币 2051 威望 5 贡献 0 技术 0 活跃 409
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 @ECHO OFF&SETLOCAL 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 复制代码 卸载VHD.cmd
@ECHO OFF&SETLOCAL 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=
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
(193.75 KB, 下载次数: 483)
注意:刚刚发现一个问题,如果您下载了下面的 “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% 复制代码
展开阅读全文​
VHD相关脚本.rar
166.4 KB, 下载次数: 41, 下载积分: PB币 -1
此包为旧文件,请下载上面已修订的包
VHD的相关脚本.rar
193.55 KB, 下载次数: 75, 下载积分: PB币 -1
此包为旧文件,请下载上面已修订的包
6
查看全部评分