|
本帖最后由 hlowld 于 2024-11-13 10:20 编辑
vhd系统体现了将系统封装打包的理念,除了不能休眠和极少的磁盘性能损失外,全是优点。配合差分可以实现简单便捷的备份和还原。
要实现vhd系统的还原,通常做法是到PE下手工操作,其实也稍显麻烦。
发一下自用的在当前系统一键制作差分还原的批处理
总体流程是:
1、将当前vhd复制为p文件 filename_p.vhdx
2、生成p文件的子文件0文件 filename_p_0.vhdx,复制0文件为a文件 filename_p_0_a.vhdx,修改BCD从a文件启动
支持 BIOS 和 UEFI,支持vhd和vhdx,支持vhd文件在无盘符的分区
借鉴了 dos时代菜鸟 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=429415 里的思路和c.vhd_path.pecmd
这里只实现了差分,具备了还原的基础,没有实现重启自动还原。我有另外一个批处理实现下次启动时还原,当需要还原时执行一次重启即可,或者设置为开机自启。
@ECHO OFF & PUSHD "%~DP0" & setlocal ENABLEDELAYEDEXPANSION
fltmc>nul||mshta vbscript:CreateObject("Shell.Application").ShellExecute("%~dpnx0","%*",,"runas",1)(window.close)&&exit
::获取系统所在vhd的信息
for /f "tokens=1,2,3,4,5,6 delims=/" %%c in ('pecmd.exe c.vhd_path.pecmd') do (
if /i "%%c"=="Error..." ( echo 当前不是从vhd启动的,退出 & goto end )
set "vol=%%c"
set "device=%%d"
set "file_path=%%~pe"
set "fname=%%~ne"
set "ext=%%~xe"
set "fullname=!vol!!file_path!!fname!!ext!"
set "fnamehz=!fname:~-2!"
set "p_file=!vol!!file_path!!fname!_p!ext!"
set "0_file=!vol!!file_path!!fname!_p_0!ext!"
set "a_file=!vol!!file_path!!fname!_p_0_a!ext!"
)
if /i "!fnamehz!" == "_p" ( echo 当前vhd是_p文件,退出 & goto end )
if /i "!fnamehz!" == "_0" ( echo 当前vhd是_0文件,退出 & goto end )
if /i "!fnamehz!" == "_a" ( echo 当前vhd是_a文件,退出 & goto end )
if /i "!fnamehz!" == "_b" ( echo 当前vhd是_b文件,退出 & goto end )
set vhd=[!device!]!file_path!!fname!_p_0_a!ext!
echo 已做好准备
pause
powershell -Command "Remove-Item -LiteralPath '!0_file!'"
::刷新系统,尽量让复制得到的p文件是最新的
rundll32 shell32.dll,SHChangeNotify
rundll32 USER32.DLL,UpdatePerUserSystemParameters
::Gpupdate /force
%~dp0refreshsys.exe
::将当前vhd复制为p文件
powershell -Command "Copy-Item -LiteralPath '!fullname!' -Destination '!p_file!' -Force"
::生成p文件的子文件0文件,复制0文件为a文件,修改BCD从a文件启动
if exist "!p_file!" (
echo create vdisk file="!0_file!" parent="!p_file!" | diskpart && (copy /y "!0_file!" "!a_file!" && (bcdedit /set {current} device vhd=!vhd! && (bcdedit /set {current} osdevice vhd=!vhd! && (echo 差分成功,建议立即重启进入差分系统,当前vhd文件则作为干净的系统备份保留 ))))
echo.
)
:end
pause
exit
|
|