VHD系统迁移工具(测试)
本帖最后由 baby1277 于 2025-8-26 09:26 编辑灵感来自http://bbs.wuyou.net/forum.php?mod=viewthread&tid=447326
原理就是先把系统备份为WIM然后再还原,理论上可行,所以写了这个工具。
仅检查脚本逻辑错误,没有实际测试过,有问题反馈下好后续改进。
@echo off
cd /d %~dp0
title VHD系统迁移工具 baby1277 2025.8.25
for %%i in (Dism wimserv) do if not exist %SystemRoot%\System32\%%i.exe echo.&echo 系统缺少必要的组件,按任意键退出。&pause>nul&exit
set path1=%~dp0
set path2=%path1: =%
if not "%path2%"=="%path1%" cls&echo.&echo 当前路径不能包含空格,按任意键退出。&pause>nul&exit
:xuan
cls
echo.
echo.
echo.
echo.本工具旨在实现VHD系统和物理磁盘系统之间的相向迁移,建议在PE或者非迁移目标的系统上运行。
echo.
echo.
echo.1. VHD系统 迁移到 物理磁盘系统
echo.
echo.
echo.2. 物理磁盘系统 迁移到 VHD系统
echo.
echo.
set /p N=请输入需要对应的数字:
echo.
echo.
if "%N%"=="1" goto xuan0
if "%N%"=="2" goto xuan0
goto xuan
:xuan0
cls
echo.
echo.
if %N% equ 1 echo 选择了 VHD系统 迁移到 物理磁盘系统
if %N% equ 2 echo 选择了 物理磁盘系统 迁移到 VHD系统
echo.
echo.
echo.
echo.输入提示1:VHD文件路径不可以有汉字和特殊符号
echo.
if %N% equ 2 echo.输入提示2:VHD文件位置也可以不输入由脚本自行创建
echo.
set /p vhd=请输入迁移VHD文件的位置:
if %N% equ 2 if not defined vhd set vhd=%cd%\Win_%random:~-2%.vhdx
for /f "delims=" %%i in ('echo %vhd%') do set "dir=%%~di"&if /i not "%%~xi"==".vhd" if /i not "%%~xi"==".vhdx" goto xuan0
set path1=%vhd%
set path2=%path1: =%
if not "%path2%"=="%path1%" cls&echo.&echo 当前路径不能包含空格,按任意键退出。&pause>nul&exit
echo.
echo.
echo.输入提示:物理磁盘位置只要输入一个字母
echo.
echo.
set /p ben=请输入迁移物理磁盘位置:
echo.
echo.
cls
set abc=C D E F G H I J K L M N O P Q R S T X U V W Y Z
if %N% equ 1 if not exist "%vhd%" goto xuan0
if %N% equ 2 if not exist "%vhd%" call :mdvhd
if not exist %ben%: goto xuan0
cls
echo.
echo.
echo.
if %N% equ 1 echo. 由 %vhd% 迁移至 %ben%:\
if %N% equ 2 echo. 由 %ben%:\ 迁移至 %vhd%
echo.
echo.
echo.
echo 请确认以上信息无误后按回车键继续&pause>nul
cls
(echo select vdisk file="%vhd%"&echo detach vdisk)|diskpart >nul 2>nul
for %%i in (%abc%) do if exist %%i: set t%%i=ok
(echo select vdisk file="%vhd%"&echo attach vdisk&echo exit)|diskpart >nul 2>nul
for %%i in (%abc%) do if exist %%i: if not defined t%%i set pan1=%%i:\
call :xuan%N%
call :bcd
cls
echo.
echo.
echo.
if %N% equ 1 echo. 由 %vhd% 迁移至 %ben%:\ 完成,按任意键重启系统。
if %N% equ 2 echo. 由 %ben%:\ 迁移至 %vhd% 完成,按任意键重启系统。
echo.
echo.
echo.
pause>nul
:mdvhd
for %%i in (%abc%) do if not exist %%i: set pan=%%i
(echo create vdisk file="%vhd%" maximum=61440 type=expandable
echo Select vdisk file="%vhd%"
echo attach vdisk
echo create partition primary
echo format quick fs=ntfs label="SYSTEM"
echo assign letter=%pan%:
echo select vdisk file="%vhd%"
echo detach vdisk
echo exit
) | diskpart >nul 2>nul
goto :eof
:xuan1
DISM /Capture-Image /ImageFile:%dir%\temp.wim /CaptureDir:%pan1% /Name:"by_baby1277"
DISM.exe /Apply-Image /ImageFile:%dir%\temp.wim /Index:1 /ApplyDir:%ben%:\
bcdboot %ben%:\Windows /l zh-ch
goto :eof
:xuan2
DISM /Capture-Image /ImageFile:%dir%\temp.wim /CaptureDir:%ben%:\ /Name:"by_baby1277"
Dism /apply-image /imagefile:%dir%\temp.wim /Index:1 /applydir:%pan1%
bcdboot %pan1%Windows /l zh-ch
goto :eof
:bcd
(echo select vdisk file="%vhd%"&echo detach vdisk)|diskpart >nul 2>nul
bcdedit /set {bootmgr} Locale zh-cn
bcdedit /timeout 3
del /f /q %dir%\temp.wim
goto :eof
谢谢分享
谢谢分享 感谢分享! 学习了解 谢谢分享 多谢分享!!! 老机器有需求 感谢楼主的分享 ! 感谢分享 很有创意,等楼主本人测试之后,我一定测试! 其实最简单的方法用DG的扇区复制,选第三个复制文件选项。
但它对源和目标的分区格式化创建时的字节大小要一样才行,否则复制文件时候会报错。
后面挂载注册表删除C盘那条记录很简单的处理。。。 这个是迁移到c:分区,还是也可以到d:分区?如果VHD 在E分区。 为什么搞这么复杂?我直接ghost磁盘对拷,从来没遇到过问题。 lbw2007 发表于 2025-8-26 11:05
为什么搞这么复杂?我直接ghost磁盘对拷,从来没遇到过问题。
没搞过呢 guong 发表于 2025-8-26 13:14
没搞过呢
把VHD当做普通系统磁盘挂载、系统迁移就好了。win8以后磁盘驱动器问题搞定,只要迁移以后重新修复引导,一般都不会报错 学习了,感谢分享
谢谢分享 继续学习
谢谢楼主分享 谢谢分享 谢谢分享
有人测试了,结果如何 回头我来试试看 谢谢分享 感谢分享 感谢分享,没用过,下载备用。原来 一直用的DG实盘转vhd,vhd转实盘。
页:
[1]
