1976yuan 发表于 2011-11-29 17:05:39

发一个VHD辅助批处理(修改部分代码并上传至网盘)

这是一个在Win7 PE下工作的bat批处理小工具,该批处理可以把安装在物理硬盘上的常规系统打包成VBOOT所支持的VHD系统(仅限WinXP/Win2003)。另外还可以对现有的VHD系统进行压缩创建差分,是下面这两个帖子的补充工具:
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=200563&extra=page%3D1

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=202697&extra=page%3D1

编写这个批处理谈不上什么技术,这些工作完全可以手工去做的,只不过为了省去手工操作的烦琐,就编写了这个bat。
另外,附件压缩包中的VBOOT是1.1版,未破解,请自行解决时间过期的问题。

下面是网盘下载地址:
http://115.com/file/cl1vohyi#
VHDBat.exe
大小: 2018085 字节
修改时间: 2011年12月3日星期六, 16:29:09
MD5: 65A6B2D6C389AEA07B8DE247C3F3F8AF
SHA1: D349772E38A9EC23B313CB5F6DF36F20B3E39935
CRC32: 77D196B3

下面是这个bat的代码清单:
@echo off
cd VHDBAT
copy *.exe %SystemRoot%
color 2F
cls
echo ************************************************************************
echo                   VHD辅助批处理工具 V0.1 By 1976yuan
echo ------------------------------------------------------------------------
echo                      1   操作现有的VHD文件
echo                      2   将物理系统WinXP灌入VHD
echo                      3   将物理系统Win2003灌入VHD
echo ------------------------------------------------------------------------
echo                   注:请在Win7PE下运行该程序!
echo ************************************************************************
echo.
choice /C 123 /M 请输入您的选择:
if errorlevel 3 goto VHDWin2003
if errorlevel 2 goto VHDWinXP
if errorlevel 1 goto ExistVHDS
:VHDWin2003
::将物理磁盘Win2003灌入VHD
set VHDOS=WIN2003
set LoaderFile=ntldr
goto SearchDiskOS
:VHDWinXP
::将物理系统WinXP灌入VHD
set VHDOS=WINXP
set LoaderFile=ntldr
goto SearchDiskOS
:SearchDiskOS
::逐一搜索每一个可见分区,搜索用户是否已经安装过物理系统
set OSNum=
set Searched=
for /f "tokens=3" %%i in ('echo list volume^|diskpart^|find "磁盘分区"') do call :SearchDiskOS1 %%i %LoaderFile% OSNum Searched
goto SpecifyDiskOS
:SearchDiskOS1
attrib -h -r %1:\%2
if exist %1:\%2 (
set %3=%1:
set %4=,直接回车默认为%1:
)
goto :eof
:SpecifyDiskOS
::指定物理系统的位置
cls
echo ************************************************************************
echo                           指定物理系统的位置
echo ------------------------------------------------------------------------
echo      物理系统%VHDOS% 所存在的位置可以是某分区的根目录,也可以是
echo      某个文件夹(如:GHO解压出来的文件),请务必按照下面的形式输入:
echo.
echo      1   对于根目录的位置,请输入 C: 的形式,冒号不能少
echo      2   对于文件夹的位置,请输入 D:\GHO 的形式,不要反斜杠"\"
echo ------------------------------------------------------------------------
echo      如不按照上面指定的方式输入物理系统的位置,本程序会出错!
echo ************************************************************************
echo.
set /P OSNum= 请输入物理系统的位置(冒号不能少,不要反斜杠"\"%Searched%):
if /I "%OSNum%"=="" goto SpecifyOS
set OSNum=%OSNum%\
:SpecifyVHD
::指定VHD文件存放的分区
cls
echo ************************************************************************
echo                           指定VHD文件存放的分区
echo ------------------------------------------------------------------------
echo      由于VHD文件一般都很大,存放VHD文件的分区最好是NTFS。
echo      另外请确保该分区的可用空间至少为物理系统%VHDOS% 已用空间的2倍
echo      否则本操作有可能会失败!
echo.
echo      请直接输入分区的字母如 C,不要冒号:
echo ************************************************************************
echo.
set DiskNum=
set /P DiskNum= 请输入%VHDOS% VHD系统存放的分区(输入盘符后回车,不要冒号)?
if /I "%DiskNum%"=="" goto SpecifyVHD
set VHDFile=%DiskNum%:\%VHDOS%\%VHDOS%.VHD
set WIMFile=%DiskNum%:\%VHDOS%\%VHDOS%.WIM
if exist %VHDFile% echo %VHDFile% 已经存在!请重新指定VHD系统存放的分区 && pause && goto SpecifyVHD
set size=15
call :SpecifyVHDSize size %size%
call :SpecifyVHDType TYPE TYPE1
:CherckInfo
::相关信息的确认
cls
echo ************************************************************************
echo                              相关信息的确认
echo ------------------------------------------------------------------------
echo             您要转换的的位置是:%OSNum%
echo             转换后VHD文件存放的位置是:%VHDFile%
echo             VHD文件的大小是: %size% (GB)
echo             VHD文件的磁盘类型是: %TYPE1% 磁盘
echo ************************************************************************
echo.
SET /P IsOK=上面的信息是否准确?(必须输入字母y并回车方可继续)
if /I not "%IsOK%"=="y" goto SpecifyOS

cls
call :BeginToVHD "下面正式开始把物理系统%VHDOS%灌入VHD之旅了:"
goto ModifyReg
:BeginToVHD
echo %~1
if not exist %DiskNum%:\%VHDOS%\ md %DiskNum%:\%VHDOS%\
call :CreateVHD %VHDFile% %size% GB %TYPE% %TYPE1%
call :AttachVHD %VHDFile%
call :FormatVHD %VHDFile% "%VHDOS% VHD"
set MountL=
call :LetterZ %VHDFile% MountL
echo ------------------------------------------------------------------------------
echo %VHDFile% 挂载后被分配到的盘符是 %MountL%
if not exist %WIMFile% call :ToWim %OSNum% %WIMFile% "%VHDOS% VHD"
call :FromWim %WIMFile% %MountL%:\
goto :eof
:ModifyReg
echo 下面的步骤是修改注册表,删除MountedDevices中的\DosDevices\C:键
echo 如果该步骤出现错误,请手工删除该键值。
::去掉%MountL%:\WINDOWS\system32\config\system的只读属性:
attrib -h -r %MountL%:\WINDOWS\system32\config\system
::加载注册表:
reg load HKLM\123 %MountL%:\WINDOWS\system32\config\system >nul 2>nul
::删除注册表MountedDevices中的值:\DosDevices\C:
reg delete HKLM\123\MountedDevices /v \DosDevices\C: /f
::卸载注册表
reg unload HKLM\123 >nul 2>nul
call :UnmountVHD %VHDFile%
goto ToVboot
:ToVboot
::转成VBOOT所支持
echo ------------------------------------------------------------------------------
echo 下面的步骤是将%VHDFile%转成VBOOT所支持:
Tools_x86\vbootctl.exe prepare %VHDFile%
call :diffvhd
echo ------------------------------------------------------------------------------
echo %VHDOS% VHD 灌制结束,请翻看上面的纪录,如果没有发现什么重大错误,本次
echo 灌制基本算是成功的;如发现有重大错误,您可能需要重启Win7PE再次运行本程序。
echo.
pause
goto OpenDir
:ExistVHDS
::操作现有的VHD文件
del %TEMP%\vhds.txt
cls
set K=0
set ISWINXP=(未找到)
set ISUSBXP=(未找到)
set ISWIN2003=(未找到)
set ISWIN7=(未找到)
::逐一搜索每一个可见的NTFS分区,搜索用户是否已经安装过VHD系统
for /f "tokens=3" %%i in ('echo list volume^|diskpart^|find "NTFS"') do call :SearchVHDS %%i
goto AfterSearch
:SearchVHDS
::在分区%1上搜索指定的操作系统
call :SearchVHDS1 %1 WINXP ISWINXP
call :SearchVHDS1 %1 USBXP ISUSBXP
call :SearchVHDS1 %1 WIN2003 ISWIN2003
call :SearchVHDS1 %1 WIN7 ISWIN7
goto :eof
:SearchVHDS1
if exist %1:\%2\%2.VHD (
echo %1:\%2\%2.VHD >> %TEMP%\vhds.txt
set VHDFile=%1:\%2\%2.VHD
set /A K=K+1
set VHDOS=%2
set DiskNum=%1
set %3=
)
goto :eof
:AfterSearch
::在逐一搜索每一个可见的NTFS分区后,根据搜索结果做出不同的处理
::如果在电脑上没有发现VHD系统,则直接跳转到NoVHDOS处
if %K%==0 (
set VHDOS=任何
goto NoVHDOS
)
::如果在电脑上只发现了一个VHD系统,则直接跳转到ChoiceWork处
if %K%==1 goto ChoiceWork
::如果在电脑上发现多个VHD系统,则跳转到ChoiceOS处
goto ChoiceOS
:ChoiceOS
::选择操作系统种类
cls
echo ************************************************************************
echo                      请选择您要操作的VHD系统
echo ------------------------------------------------------------------------
echo                      1   WinXP VHD系统 %ISWINXP%
echo                      2   USBXP VHD系统 %ISUSBXP%
echo                      3   Win2003 VHD系统 %ISWIN2003%
echo                      4   Win7 VHD系统 %ISWIN7%
echo ************************************************************************
echo.
choice /C 1234 /M 请输入您的选择:
if errorlevel 4 goto win7
if errorlevel 3 goto win2003
if errorlevel 2 goto USBXP
if errorlevel 1 goto winxp
:win7
call :ChoicePart WIN7
goto :eof
:win2003
call :ChoicePart WIN2003
goto :eof
:usbxp
call :ChoicePart USBXP
goto :eof
:winxp
call :ChoicePart WINXP
goto :eof
:ChoicePart
::有可能在多个分区同时存在WinXP VHD系统,因此有必要提醒用户要对哪一个分区的WinXP VHD文件进行操作
set VHDOS=%1
set /A K=0
for /f %%i in ('type %TEMP%\vhds.txt^|find "%1"') do call :ChoicePart2 %%i
if %K%==0 goto NoVHDOS
if %K%==1 goto ChoiceWork
goto ChoicePart3
:ChoicePart2
set /A K=K+1
set VHDFile=%1
set DiskNum=%VHDFile:~0,1%
goto :eof
:ChoicePart3
cls
echo ************************************************************************
echo               分别在下面的位置安装了%VHDOS% VHD系统:
echo ------------------------------------------------------------------------
for /f %%i in ('type %TEMP%\vhds.txt^|find "%1"') do echo                     %%i
echo.
echo ************************************************************************
echo.
set /P DiskNum= 您要操作哪个盘的%VHDOS% VHD系统(输入盘符后回车,不要冒号)?
set VHDFile=%DiskNum%:\%VHDOS%\%VHDOS%.VHD
goto ChoiceWork
goto :eof
:NoVHDOS
cls
echo ************************************************************************
echo                   您的电脑上没有安装 %VHDOS% VHD系统!
echo ************************************************************************
pause
exit 1
:ChoiceWork
::选择操作(压缩磁盘还是创建差分还是转VBoot所支持)
cls
if not exist %VHDFile% (
   echo %VHDFile% 文件不存在,请确保输入正确!
pause
goto ChoicePart3
)
echo ************************************************************************
echo                      VHD 系统是:%VHDOS%
echo                      所在分区是:%DiskNum%
echo                      VHD 文件是:%VHDFile%
echo ------------------------------------------------------------------------
echo   1、创建差分 2、用Ghost压缩 3、用Wim压缩 4、转VBoot所支持(仅限XP/03)   
echo ************************************************************************
echo.
choice /C 1234 /M 请选择您要进行的操作:
if errorlevel 4 goto ToVboot
if errorlevel 3 goto CompressByWim
if errorlevel 2 goto CompressByGhost
call :diffvhd
goto OpenDir
:diffvhd
::创建差分
if exist %DiskNum%:\%VHDOS%\%VHDOS%_CH.VHD del %DiskNum%:\%VHDOS%\*CH*.VHD
call :CreateDiffVHD %DiskNum%:\%VHDOS%\%VHDOS%_CH.VHD %VHDFile%
if "%VHDOS%"=="WIN7" (
call :CreateDiffVHD %DiskNum%:\%VHDOS%\%VHDOS%_CH_CH.VHD %DiskNum%:\%VHDOS%\%VHDOS%_CH.VHD
copy %DiskNum%:\%VHDOS%\%VHDOS%_CH.VHD %DiskNum%:\%VHDOS%\%VHDOS%_CH_BAK.VHD
copy %DiskNum%:\%VHDOS%\%VHDOS%_CH_CH.VHD %DiskNum%:\%VHDOS%\%VHDOS%_CH_CH_BAK.VHD
goto :eof
)
copy %DiskNum%:\%VHDOS%\%VHDOS%_CH.VHD %DiskNum%:\%VHDOS%\%VHDOS%_CH_BAK0.VHD
copy %DiskNum%:\%VHDOS%\%VHDOS%_CH.VHD %DiskNum%:\%VHDOS%\%VHDOS%_CH_BAK1.VHD
goto :eof
:CompressByWim
::用imagex.exe工具压缩VHD,其工作原理是先把VHD文件备份到一个WIM文件,
::再把WIM文件释放到新的VHD文件,这种方法的优点是可以更改VHD的尺寸
::缺点是没有GHOST方式速度快
set WIMFile=%DiskNum%:\%VHDOS%\%VHDOS%.WIM
call :ReadVHDSize%VHDFile% size unit
if "%unit%"=="MB" set /A size=size/1024
call :SpecifyVHDSize size %size%
call :SpecifyVHDType TYPE TYPE1
call :AttachVHD %VHDFile%
call :LetterZ %VHDFile% MountL
echo ------------------------------------------------------------------------------
echo %VHDFile% 挂载后被分配到的盘符是 %MountL%
call :ToWim %MountL%:\ %WIMFile% "Temp"
call :UnmountVHD %VHDFile%
echo ------------------------------------------------------------------------------
echo 下面是删除%VHDFile%:
del %VHDFile%
call :BeginToVHD "下面的过程是将%WIMFile%还原到 %VHDFile%的一系列步骤..."
call :UnmountVHD %VHDFile%
echo 下面是删除%WIMFile%:
del %WIMFile%
goto DetachAgain
:CompressByGhost
::用Ghost压缩VHD
for /f "tokens=2" %%i in ('echo list disk^|diskpart^|find "磁盘"') do set disk0=%%i
set /A disk0=disk0+1
set /A disk1=disk0+1
set /A disk2=disk0+2
cls
echo ************************************************************************
echo                  您的电脑已经安装了 %disk0% 块物理磁盘
echo ------------------------------------------------------------------------
echo             %VHDFile% 文件将被挂载成第%disk1%块虚拟磁盘
echo             %DiskNum%:\%VHDOS%\Temp.VHD 文件将被挂载成第%disk2%块虚拟磁盘
echo ------------------------------------------------------------------------
echo               将通过下面的Ghost命令达到压缩VHD文件的效果:
echo             ghost32 -clone,mode=copy,src=%disk1%,dst=%disk2% -sure
echo ************************************************************************
echo.
SET /P IsOK=上面的信息是否准确?(必须输入字母y并回车方可继续)
if /I not "%IsOK%"=="y" goto CompressByGhost
attrib -h -r %VHDFile%
::用GHOST压缩VHD的过程是:先读取待压缩VHD的体积,再由用户选择压缩成动态扩展磁盘还是固定大小磁盘
::之后创建VHD,最后调用GHOST硬盘对拷,完成压缩功能
call :ReadVHDSize%VHDFile% size unit
call :SpecifyVHDType TYPE TYPE1
call :CreateVHD %DiskNum%:\%VHDOS%\Temp.VHD %size% %unit% %TYPE% %TYPE1%
call :AttachVHD %VHDFile%
call :AttachVHD %DiskNum%:\%VHDOS%\Temp.VHD
:GhostClone
echo.
echo ************************************************************************
echo       下面将通过Ghost压缩 %DiskNum%:\%VHDOS%\%VHDOS%.VHD
echo       请耐心等待Ghost操作,同时请不要关闭本窗口!
echo ************************************************************************
echo Y:\tools\ghost\ghost32 -clone,mode=copy,src=%disk1%,dst=%disk2% -sure
pause
Y:\tools\ghost\ghost32 -clone,mode=copy,src=%disk1%,dst=%disk2% -sure
::Ghost对拷结束后就分离VHD文件
call :UnmountVHD %VHDFile%
call :UnmountVHD %DiskNum%:\%VHDOS%\Temp.VHD
::删除原VHD,重命名Temp.VHD
:delTemp
cd /d %DiskNum%:\%VHDOS%\
del %VHDOS%.VHD
ren Temp.VHD %VHDOS%.VHD
::二次分离VHD文件
:DetachAgain
echo.
echo ************************************************************************
echo                     最后再挂载和分离一下VHD文件
echo -----------------------------------------------------------------------
echo       疑惑不解:不知何故,用GHOST对拷后或新创建的VHD文件,如果
echo               再挂载和分离一下,VHD文件还会变小一些。
echo               这种怪现象我是通过反复对拷一个已经无法再压缩的
echo               VHD文件时偶然发现的,为了最大限度的减少VHD体积
echo               就只好反复分离和挂载一下VHD文件了......
echo ************************************************************************
call :AttachVHD %VHDFile%
call :UnmountVHD %VHDFile%
call :diffvhd
:CompressOK
echo.
echo ************************************************************************
echo             %DiskNum%:\%VHDOS%\%VHDOS%.VHD 压缩完成!
echo ************************************************************************
pause
goto OpenDir
:ReadVHDSize
::读取VHD磁盘的体积大小和单位的主过程
::-----%1 全路径格式的VHD文件
::-----%2 VHD文件的体积大小
::-----%3 VHD文件的体积所用的单位(如:GB,MB)
echo Select vdisk file=%1 > %TEMP%\ReadVHDSize.txt
echo Detail vdisk >> %TEMP%\ReadVHDSize.txt
for /f "tokens=2,3"%%i in ('diskpart /s %TEMP%\ReadVHDSize.txt^|find "虚拟大小"') do call :ReadVHDSize2 %%i %2 %%j %3
goto :eof
:ReadVHDSize2
::读取VHD磁盘的体积大小和单位的子过程
::-----%1 来自主过程所读取到的VHD文件的体积数值
::-----%2 来自主过程的2号参数
::-----%3 来自主过程所读取到的VHD文件体积的单位(如:GB,MB)
::-----%4 来自主过程的3号参数
set %2=%1
set %4=%3
goto :eof
:SpecifyVHDSize
::指定VHD文件的体积大小
cls
echo ************************************************************************
echo                           指定VHD文件的体积大小
echo ------------------------------------------------------------------------
echo.
echo      在磁盘空间允许的前提下,尽可能设置大一点,具体多少请自行斟酌
echo ************************************************************************
echo.
set /P size=请输入VHD文件的大小,单位是GB (直接回车默认为 %2 GB):
set %1=%size%
goto :eof
:SpecifyVHDType
::指定VHD文件的磁盘类型
::-------%1 为TYPE,英文,表示EXPANDABLE或FIXED
::-------%2 为TYPE1,中文,表示动态扩展或固定大小
cls
echo ************************************************************************
echo                           VHD文件选项
echo ------------------------------------------------------------------------
echo                   1   创建 动态扩展 磁盘
echo                   2   创建 固定大小 磁盘
echo ************************************************************************
echo.
choice /C 12 /M 请选择您要进行的操作:
if errorlevel 2 goto SpecifyVHDType2
if errorlevel 1 goto SpecifyVHDType1
:SpecifyVHDType1
set %1=EXPANDABLE
set %2=动态扩展
goto :eof
:SpecifyVHDType2
set %1=FIXED
set %2=固定大小
goto :eof
:CreateVHD
::创建VHD文件
::-------%1 为全路径的VHD文件名
::-------%2 为VHD文件的体积尺寸
::-------%3 为VHD文件的体积所用的单位(如GB MB)
::-------%4 为VHD文件磁盘类型的英文描述,FIXED或EXPANDABLE
::-------%5 为VHD文件磁盘类型的中文描述,固定大小或动态扩展
set /A size=%2
if "%3"=="GB" set /A size=size*1024
echo Create Vdisk FILE=%1 MAXIMUM=%size% TYPE=%4 > %TEMP%\createhd.txt
set /A size=size/1024
echo ------------------------------------------------------------------------------
echo 正在创建 %1 (磁盘大小:%size% GB,磁盘类型:%5)
echo 如果是 固定大小 的磁盘,需要的时间可能有些长,
echo 请耐心等待 ......
diskpart /s %TEMP%\createhd.txt
pause
goto :eof
:CreateDiffVHD
::创建制定VHD文件的差分磁盘
::-------%1 为全路径的差分VHD文件名
::-------%2 为全路径的母盘VHD文件名
echo ------------------------------------------------------------------------------
echo 正在创建差分磁盘 %1,请稍候...
echo CREATE VDISK FILE=%1 PARENT=%2> %TEMP%\creatediff.txt
diskpart /s %TEMP%\creatediff.txt
pause
goto :eof
:AttachVHD
::-------%1 为全路径的VHD文件名
echo ------------------------------------------------------------------------------
echo 下面是连接%1:
echo Select Vdisk FILE=%1 > %TEMP%\selecthd.txt
echo Attach Vdisk >> %TEMP%\selecthd.txt
diskpart /s%TEMP%\selecthd.txt
goto :eof
:FormatVHD
::-------格式化VHD文件,该VHD必须先连接
::-------%1 为全路径的VHD文件名
::-------%2 为格式化的卷标,如有空格,请用双引号
set disk0=
echo ------------------------------------------------------------------------------
echo 正在搜索%1文件所关联的磁盘号,以便对该磁盘进行格式化操作...
echo Select vdisk file=%1 > %TEMP%\FormatVHD.txt
echo Detail vdisk >> %TEMP%\FormatVHD.txt
for /f "tokens=2"%%i in ('diskpart /s %TEMP%\FormatVHD.txt^|find "关联的磁盘号" ') do set disk0=%%i
echo 搜索到的磁盘号是:%disk0%
if "%disk0%"=="" (
echo 没有搜索到%1 所关联的磁盘号,可能出现了连接错误
echo 为避免错误格式化带来数据损失,本程序暂运行到此处
pause
exit
)
echo Select Disk %disk0% > %TEMP%\FormatVHD.txt
echo List Disk >> %TEMP%\FormatVHD.txt
diskpart /s %TEMP%\FormatVHD.txt
echo Select Disk %disk0% > %TEMP%\FormatVHD.txt
echo Create Partition Primary >> %TEMP%\FormatVHD.txt
echo Select Partition 1 >> %TEMP%\FormatVHD.txt
echo Format FS=NTFS LABEL="%~2" QUICK >> %TEMP%\FormatVHD.txt
echo ACTIVE >> %TEMP%\FormatVHD.txt
echo.
echo 下面将要执行危险的格式化操作了
echo 请仔细核对上面磁盘号为%disk0%的磁盘(前面带*号的)是否就是%VHDFile%
echo 如果上面的磁盘信息准确无误,请继续,否则请立即关闭本程序!
echo 请自行承担错误格式化磁盘所带来的数据丢失的风险!
pause
echo ------------------------------------------------------------------------------
echo 正在格式化虚拟磁盘...
diskpart /s %TEMP%\FormatVHD.txt
goto :eof
:LetterZ
::给一个已经挂载了的VHD文件分配一个可用的盘符:
::-------%1 全路径格式的VHD文件,该文件必须已经挂载好了,并且该VHD只有一个NTFS格式的分区
::-------%2 用来返回分配到的盘符
echo Select vdisk file=%1 > %TEMP%\LetterZ.txt
echo Detail vdisk >> %TEMP%\LetterZ.txt
for /f "tokens=2"%%i in ('diskpart /s %TEMP%\LetterZ.txt^|find "关联的磁盘号" ') do call :LetterZ2 %%i %2
goto :eof
:LetterZ2
echo Select Disk %1 > %TEMP%\LetterZ2.txt
echo Detail Disk >> %TEMP%\LetterZ2.txt
for /f "tokens=2"%%i in ('diskpart /s %TEMP%\LetterZ2.txt^|find "NTFS" ') do call :LetterZ3 %%i %2
goto :eof
:LetterZ3
echo Select volume %1 > %TEMP%\LetterZ.txt
echo ASSIGN >> %TEMP%\LetterZ.txt
diskpart /s %TEMP%\LetterZ.txt
for /f "tokens=3"%%i in ('diskpart /s %TEMP%\LetterZ2.txt^|find "NTFS" ') do set %2=%%i
goto :eof
:UnmountVHD
::-------%1 为全路径的VHD文件名
echo ------------------------------------------------------------------------------
echo 为了能够正确分离VHD,需要重新扫描一下磁盘,请稍候...
echo RESCAN > %TEMP%\RESCAN.txt
diskpart /s %TEMP%\RESCAN.txt
echo ------------------------------------------------------------------------------
echo 下面将分离%1:
echo Select disk 0 > %TEMP%\unmounthd.txt
echo Select Vdisk FILE=%1 >> %TEMP%\unmounthd.txt
echo DETACH Vdisk >> %TEMP%\unmounthd.txt
diskpart /s %TEMP%\unmounthd.txt
echo.
echo 请仔细观察上面的提示信息,如果出现“虚拟磁盘服务错误:”的字眼,
echo 则意味着%VHDFile%并没有真正分离,接下来的操作将会失败。
echo 您需要重启Win7 PE系统或手工完成剩下的操作。
echo 有时会出现无法正确分离VHD的现象,这有可能是Win7 PE本身的Bug
goto :eof
:ToWim
echo 下面是把%~1 下的所有文件备份到 %~2:
imagex /compress maximum /capture %~1 %~2 %~3
echo ------------------------------------------------------------------------------
goto :eof
:FromWim
echo 下面是把%~1释放到%~2
imagex /apply %~1 1 %~2
echo ------------------------------------------------------------------------------
goto :eof
:OpenDir
explorer.exe %DiskNum%:\%VHDOS%\
exit

[ 本帖最后由 1976yuan 于 2011-12-3 16:34 编辑 ]

ziyoudu 发表于 2011-11-29 18:12:47

这个要支持               .

wan06 发表于 2011-11-30 10:43:37

附件太多了!不好下载!不可上传到网盘吗?

1976yuan 发表于 2011-11-30 13:26:43

回复 #3 wan06 的帖子

已经上传到网盘了,欢迎修改指正!

wanghh 发表于 2011-11-30 15:18:39

☆۩۞۩☆【谢谢提供!】 ☆۩۞۩☆

wan06 发表于 2011-12-2 07:41:29

很好用,什么时候作个支持win7的批处理

xyxb 发表于 2011-12-2 09:49:31

下载中。。。。。。。

tulongwa 发表于 2011-12-3 21:16:12

简单易行,谢谢

wjgyz740526 发表于 2011-12-4 20:14:15

用你的工具把物理系统灌入VHD启动后报错 0X0000000F

何解?

1976yuan 发表于 2011-12-5 09:39:26

回复 #9 wjgyz740526 的帖子

在我的工具里面没有提供破解

wjgyz740526 发表于 2011-12-5 11:28:12

我的系统时间是2010年啊

1976yuan 发表于 2011-12-5 17:08:50

回复 #11 wjgyz740526 的帖子
我的bat工具将物理系统打包到VHD步骤是这样的:先把物理系统用imagex工具打包成一个临时的wim文件,然后创建一个VHD文件,格式化后再把wim文件释放到VHD中去,释放完毕再用vbootctl.exe prepare 命令将VHD转成VBOOT所支持,也就是离线注入VBOOT驱动,这一过程是VBOOT官方的方法。按理应该不会有问题的。您可以尝试用纯手工的方式把物理系统灌制成VHD,如果不会蓝屏,那有可能是我的bat工具在执行imagex工具把物理系统打包成一个临时wim文件这一步时出现了文件损坏之类的问题。毕竟使用的高压缩这个参数。如果真的是这样,请您用记事本打开我的bat文件,找到下面的代码(在整个文件的末尾),把红色部分删除掉,再试试看。

:ToWim
echo 下面是把%~1 下的所有文件备份到 %~2:
imagex /compress maximum /capture %~1 %~2 %~3
echo ------------------------------------------------------------------------------
goto :eof

2011_1111 发表于 2011-12-5 20:00:44

::转成VBOOT所支持
echo ------------------------------------------------------------------------------
echo 下面的步骤是将%VHDFile%转成VBOOT所支持:
Tools_x86\vbootctl.exe prepare %VHDFile%
call :diffvhd
echo ------------------------------------------------------------------------------
echo %VHDOS% VHD 灌制结束,请翻看上面的纪录,如果没有发现什么重大错误,本次
echo 灌制基本算是成功的;如发现有重大错误,您可能需要重启Win7PE再次运行本程序。


多次测试,都是这一句不成功,请教如何解决?

1976yuan 发表于 2011-12-6 08:59:47

回复 #13 2011_1111 的帖子

1、请提供不成功时的所有提示信息。
2、在执行Tools_x86\vbootctl.exe prepare %VHDFile%不成功时,关闭bat,并通过磁盘管理界面把VHD彻底分离出来,再在命令行下用手工执行vbootctl.exe prepare D:\winxp\winxp.vhd 命令(红色部分请根据自己的情况修改),看看是否会成功。
3、如果第2步还是不行,请重启Win7PE,再在命令行下用手工执行vbootctl.exe prepare,看看是否会成功。

[ 本帖最后由 1976yuan 于 2011-12-6 09:01 编辑 ]

wan06 发表于 2011-12-9 20:46:45

能压缩win7VHD吗?

1976yuan 发表于 2011-12-10 13:00:52

回复 #15 wan06 的帖子

在我的真机上测试是可以的.

顺便讲一个我的一个关于制作Win7 VHD的经历:
曾经帮朋友的笔记本安装过Win7 VHD系统,系统是装在第一分区的.等整个系统全部安装好了之后,我想将这个分区重新格式化一下,以便消除磁盘碎片带来的效率下降问题.我的做法是先把Win7.VHD这个文件复制到其他的分区.之后再格式化第一分区,格式化完毕再把Win7.VHD剪切回来.结果再启动电脑时就出现7B蓝屏.无论怎么弄都是蓝屏,无奈之下只好重新制作.

仅仅是进行了一下这么简单的一个文件复制步骤,辛辛苦苦做的Win7VHD就报废了,那天的确是把我给气晕了.由于人家的电脑是刚买还不到1个月的新电脑(是联想的笔记本,具体型号已经忘记了),一般来说可以排除硬盘划道的问题.我想可能是Win7系统实在太庞大了,导致VHD文件超大.对于超大的单文件,也许现有的Windows系统或NTFS分区可能还存在某些不可预知的Bug吧.

在我做Win7 VHD的经历中,经常会遇到莫名的蓝屏问题出现.

所以,我现在的做法是:将Win7 VHD单独安装到某一个专用的分区,做完之后也不压缩VHD,也不整理磁盘碎片,直接创建差分,之后隐藏这个分区.

[ 本帖最后由 1976yuan 于 2011-12-10 13:12 编辑 ]
页: [1]
查看完整版本: 发一个VHD辅助批处理(修改部分代码并上传至网盘)