|
本帖最后由 BEIKING 于 2025-5-15 22:31 编辑
楼主大佬请教下,在你的基础上,我尝试修改。
目前是取消了还原操作后的BCDEdit写引导和重启操作,
加入刷新磁盘,调用CALL Reset解决切换操作后的分区丢失(不知道这种方式解决是否合适)
主要还是请教你,刷新磁盘怎么连带更新目标分区列表。
这是我修改的代码:
- #code=936T950
- @TEAM ENVI^ EnviMode=1| ENVI^ ForceLocal=1
- TEAM SET$ &NL=0d 0a| SET$ &TAB=09
- ENVI &::MEXE=%&CurDir%\Snapshot.exe
- IFEX $%&bX64%=0,! IFEX %&CurDir%\Snapshot64.exe,ENVI &::MEXE=%&CurDir%\Snapshot64.exe
- NAME FileName=%&::MEXE%
- ENVI ?,&DSVer=FVER,%&::MEXE%
- _SUB WIN1,W500H535,Snapshot 备份还原,,#1,
- GROU GROU1,L10T5W475H55,
- LABE LABE1,L20T19W145H16,1. 请选择将要执行的操作:,,,
- RADI RADI1,L50T35W85H20,完整备份(&F),CALL ControlSwitch,1,0
- RADI RADI2,L200T35W85H20,差异备份(&D),CALL ControlSwitch,0,0
- RADI RADI3,L350T35W85H20,还原分区(&R),CALL ControlSwitch,0,0
- GROU GROU2,L10T63W475H42,
- LABE LABE2,L18T80W350H18,2. 请选择一个目标分区:,,,
- CALL ListDrive &AllDrive
- ENVI PF=%&AllDrive%
- LIST Partition,L160T76W318H200,%PF%,ENVI @LABE21=%Partition%,C:,
- GROU GROU3,L10T110W475H310,
- LABE LABE3,L18T125W350H18,,,
- LABE LABE31,L36T145W3600H30,鼠标左键选择分区,双击【显示盘符】或【隐藏盘符】,可添加或删除映像文件名。,,,
- IMAG IMAG2,L457T120W20H20,shell32.dll#238,CALL OnTable,
- ENVI @IMAG2.MSG=0x02A1:CALL ControlTip "点击 → 刷新磁盘分区信息"
- ENVI @IMAG2.MSG=0x02A3:TIPS -
- SET &&TITLE=+40:序号%&TAB%+40:盘符%&TAB%=70:总大小%&TAB%=70:可用空间%&TAB%+60:分区类型%&TAB%+60:文件系统%&TAB%95:卷标
- TABL TABL3,L18T165W460H150,%&TITLE%,,0x10040
- ITEM -na ITEM21,L80T323W85H22,显示盘符,CALL XSPF,
- ITEM -na ITEM22,L320T323W85H22,隐藏盘符,CALL YCPF,
- LIST LIST31,L20T355W410H20,,,,0x4
- LIST LIST321,L20T355W410H20,,,,0x4
- LIST LIST322,L20T385W410H20,,,,
- LIST LIST33,L20T355W410H20,,,,
- ITEM -na ITEM31,L440T353W35H22,Sna,CALL PickImageFile,,
- ITEM -na ITEM321,L440T353W35H22,Sna,CALL PickImageFile,,
- ITEM -na ITEM322,L440T383W35H22,Hsh,PickHshFiles,,
- ITEM -na ITEM33,L440T353W35H22,Sna,CALL PickImageFile,,
- LABE -left LABE5,L15T440W30H15, ?,MESS+icon2 \n文件版本:Snapshot 备份还原 V2.0.2025.0512 \n\n支撑软件:Snapshot.exe、Snapshot64.exe(自适应+自决定:64位系统中 Snapshot64.exe 存在优先使用) \n\n\n\n使用说明:\n\n1 备份分区:\n\n1.1 完整备份:【选择一个目标分区】→【指定用于保存备份的映像文件】→【执行】; \n\n1.2 差异备份:【选择一个目标分区】→【指定用于保存备份的映像文件】→【指定用于增量备份的哈希文件】→【执行】;\n\n 哈希文件(*.hsh)的生成:\n\n 【程序界面右下角蓝字】→【备份分区】→【下一步】→【高级选项】→【从完整映像创建哈希文件(H)】;\n\n2 还原分区:【选择一个目标分区】→【指定用于还原备份的映像文件】→【执行】;\n\n3 在 Win PE 下备份分区,可以实现大分区恢复到小分区。@关于 Snapshot 备份还原#OK,0xFF0000,
- ENVI @LABE5.MSG=0x02A1:CALL ControlTip "点击 → 查看帮助"
- ENVI @LABE5.MSG=0x02A3:TIPS -
- ITEM -na ITEM4,L350T430W60H30,执行,CALL StartingBackupRestore,
- ITEM -na ITEM5,L425T430W60H30,退出,EXIT FILE,
- LABE+ ,L-1T470W520H1,,,
- LABE -left LABE4,L5T480W350H12,,,
- FIND $%&DSVer%=,! LABE -right LABE6,L350T480W140H12,%FileName% %DSVer%,EXEC %&::MEXE%,0xFF0000,
- ENVI @LABE6.MSG=0x02A1:CALL ControlTip "点击 → 启动 Snapshot"
- ENVI @LABE6.MSG=0x02A3:TIPS -
- CALL Initialize
- _END
- CALL @WIN1
- _SUB OnTable
- ENVI &TableInfo=
- PART list disk ,&AllDisks
- FORX * %&AllDisks%,&DiskNum,
- {
- PART list part %&DiskNum%,&AllParts
- FORX * %&AllParts%,&PartNum,
- {
- IFEX $%&PartNum%>0,! EXIT -
- TEAM ENVI &ID=| &DL=| ENVI &VS=| ENVI &VFS=| ENVI &TP=| ENVI &FS=| ENVI &VL=| ENVI &Unit1=| ENVI &Unit2=
- ENVI &ID=%&DiskNum%:%&PartNum%
- PART list part %&DiskNum%:%&PartNum%,&PartInfo
- MSTR &TP,&VS,&DL=<3><5><8>%PartInfo%
- IFEX \\?\Harddisk%&DiskNum%Partition%&PartNum%\=?,&VFS
- FDRV -vol &VL,&FS=\\?\Harddisk%&DiskNum%Partition%&PartNum%
- IFEX $%&VS%<1024,ENVI &Unit1=Byte
- IFEX $%&VS%>1024,TEAM CALC $ &VS = %&VS% / 1024 ##2| ENVI &Unit1=KB
- IFEX $%&VS%>1024,TEAM CALC $ &VS = %&VS% / 1024 ##2| ENVI &Unit1=MB
- IFEX $%&VS%>1024,TEAM CALC $ &VS = %&VS% / 1024 ##2| ENVI &Unit1=GB
- IFEX $%&VS%>1024,TEAM CALC $ &VS = %&VS% / 1024 ##2| ENVI &Unit1=TB
- IFEX $%&VFS%<1024,ENVI &Unit2=Byte
- IFEX $%&VFS%>1024,TEAM CALC $ &VFS = %&VFS% / 1024 ##2| ENVI &Unit2=KB
- IFEX $%&VFS%>1024,TEAM CALC $ &VFS = %&VFS% / 1024 ##2| ENVI &Unit2=MB
- IFEX $%&VFS%>1024,TEAM CALC $ &VFS = %&VFS% / 1024 ##2| ENVI &Unit2=GB
- IFEX $%&VFS%>1024,TEAM CALC $ &VFS = %&VFS% / 1024 ##2| ENVI &Unit2=TB
- FIND $%TP%<>GPT,ENVI &TP=MBR
- ENVI &TableInfo=%&TableInfo%%&ID%%&TAB%%&DL%%&TAB%%&VS%%&Unit1%%&TAB%%&VFS%%&Unit2%%&TAB%%&TP%%&TAB%%&FS%%&TAB%%&VL%%NL%
- }
- }
- ENVI @TABL3.Val=1*#;%&TableInfo%
- _END
- _SUB ControlTip
- TEAM TIPS -| ENVI &ShowContent=
- ENVI &ShowContent=%~1
- ENVI @@Cur=?&CurXM;&CurYM
- TIPS ,%&ShowContent%,,0,@AL%&CurXM%T%&CurYM%
- _END
- _SUB ControlSwitch
- TEAM ENVI @LIST31.Visible=%RADI1.Check% | ENVI @ITEM31.Visible=%RADI1.Check%
- TEAM ENVI @LIST321.Visible=%RADI2.Check% | ENVI @LIST322.Visible=%RADI2.Check% | ENVI @ITEM322.Visible=%RADI2.Check%
- TEAM ENVI @LIST33.Visible=%RADI3.Check% | ENVI @ITEM33.Visible=%RADI3.Check%
- IFEX $%RADI1.Check%=1,TEAM ENVI @LABE3=3. 请指定用于保存备份的映像文件: |ENVI @LIST31=D:\Snap\FullBackup.sna
- IFEX $%RADI2.Check%=1,TEAM ENVI @LABE3=3. 请指定用于保存备份的映像文件及增量备份的哈希文件: |ENVI @LIST321=D:\Snap\DiffBackup.sna
- IFEX $%RADI3.Check%=1,ENVI @LABE3=3. 请指定用于还原备份的映像文件:
- CALL Reset
- _END
- _SUB Initialize
- CALL OnTable
- CALL ControlSwitch
- THREAD* CALL ScanImageFiles
- _END
- _SUB ScanImageFiles
- ENVI @LABE4=正在扫描本地磁盘上的 SNA 映像文件...
- FORX /S:3 \*.sna,&ImageFiles,0,ENVI @LIST33.ADD=%&ImageFiles%
- ENVI @LABE4=正在扫描本地磁盘上的 HSH 映像文件...
- FORX /S:3 \*.hsh,&HshFiles,0,ENVI @LIST322.ADD=%&HshFiles%
- FIND $%LABE4%=正在扫描本地磁盘上的 HSH 映像文件...,ENVI @LABE4=准备就绪
- _END
- _SUB PickImageFile
- IFEX $%RADI1.Check%=1,
- {
- BROW &ImageFile,D:\*.sna,请指定用于保存备份的映像文件,映像文件(*.sna)|*.sna|,0x802
- FIND $%&ImageFile%=,!
- {
- FEXT &FileExt=%&ImageFile%
- FIND $%&FileExt%=,ENVI @LIST31.ADDSEL=%&ImageFile%.sna! ENVI @LIST31.ADDSEL=%&ImageFile%
- }
- }
- IFEX $%RADI2.Check%=1,
- {
- BROW &ImageFile,D:\*.sna,请指定用于保存备份的映像文件,映像文件(*.sna)|*.sna|,0x802
- FIND $%&ImageFile%=,!
- {
- FEXT &FileExt=%&ImageFile%
- FIND $%&FileExt%=,ENVI @LIST321.ADDSEL=%&ImageFile%.sna! ENVI @LIST321.ADDSEL=%&ImageFile%
- }
- }
- IFEX $%RADI3.Check%=1,
- {
- BROW &ImageFile,D:\*.sna,请指定用于还原备份的映像文件,SNA 映像文件(*.sna)|*.sna|,0x1000
- FIND $%&ImageFile%=,! ENVI @LIST33.ADDSEL=%&ImageFile%
- }
- _END
- _SUB PickHshFiles
- BROW &HshFiles,D:\*.hsh,请指定用于差异备份的哈希文件,哈希文件(*.hsh)|*.hsh|,0x1000
- FIND $%&HshFiles%=,! ENVI @LIST322.ADDSEL=%&HshFiles%
- _END
- _SUB StartingBackupRestore
- LSTR Partition1=2,%Partition%
- LSTR Partition2=1,%Partition%
- LSTR Image_path31=2,%LIST31%
- FIND $%Image_path31%=%Partition%,TEAM MESS+icon1 映像路径所在分区不能与要备份的分区相同! @提示:#OK |EXIT 1
- LSTR Image_path=7,%LIST31%
- TEAM EXEC =!cmd /c MD %Image_path%|SITE %Image_path%,+A+R+S
- SED Partition=0,[^0-9], ,%Partition%
- MSTR &P1,&P2=<1*>%Partition%
- FIND $%P1%=,!TEAM CALC #&DiskNum = %P1% + 1|ENVI Partition1=HD%&DiskNum%:%P2% |ENVI Partition2=HD%&DiskNum%_%P2%
- IFEX $%RADI1.Check%=1,
- {
- FIND $%LIST31%=,TEAM MESS+icon6 保存备份的映像文件不能为空!@错误 #OK *-5000| EXIT _SUB
- ENVI &OParam=-R -G -L0 -o
- ENVI &BParam=%Partition1% "%LIST31%"
- MESS+icon0 即将把分区 %Partition1% 备份于 %LIST31% 文件中。 @完整备份确认 #OKC $C
- FIND $%YESNO%=CANCEL,EXIT _SUB
- TEAM ENVI @LABE4=正在完整备份分区,请稍等...| ENVI @ITEM21.Enable=0| ENVI @ITEM22.Enable=0| ENVI @ITEM31.Enable=0| ENVI @ITEM321.Enable=0| ENVI @ITEM33.Enable=0| ENVI @ITEM4.Enable=0| ENVI @ITEM5.Enable=0
- EXEC -wait %&::MEXE% -Gx -!resize %Partition1%
- EXEC -wait %&::MEXE% %&BParam% %&OParam%
- EXEC -wait %&::MEXE% -Gx -Y --resize %Partition1% 9999999999999
- DATE
- //%CurDate%中,结果可能是"2024-3-28|4|18:10:36.158"
- SED CurDate=0,[^0-9], ,%CurDate%
- MSTR &C1,&C2,&C3,&C4,&C5,&C6,&C7,&C8=<1*>%CurDate%
- ENVI TimeName=%C1%-%C2%-%C3%_%C5%-%C6%-%C7%
- NAME Image_FileName=%LIST31%
- FILE %Image_path%\%Image_FileName%.sna>>%Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna
- IFEX %Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna,MESS+icon2 磁盘分区完整备份完毕!其备份文件为:%Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna。 @提示:#OK
- IFEX %Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna,! MESS+icon2 磁盘分区完整备份出错! @提示:#OK
- SITE %Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna,+A+R+S
- ENVI @LIST33.ADDSEL=%LIST31%
- }
- IFEX $%RADI2.Check%=1,
- {
- FIND $%LIST321%=,TEAM MESS+icon6 保存备份的映像文件不能为空!@错误 #OK *-5000| EXIT _SUB
- FIND $%LIST322%=,TEAM MESS+icon6 差异备份的哈希文件不能为空!@错误 #OK *-5000| EXIT _SUB
- ENVI &OParam=-R -G -L0
- ENVI &BParam=%Partition1% "%LIST321%" -h"%LIST322%"
- MESS+icon0 即将把分区 %Partition1% 备份于 %LIST321% 文件中。@差异备份确认 #OKC $C
- FIND $%YESNO%=CANCEL,EXIT _SUB
- TEAM ENVI @LABE4=正在差异备份分区,请稍等...| ENVI @ITEM21.Enable=0| ENVI @ITEM22.Enable=0| ENVI @ITEM31.Enable=0| ENVI @ITEM321.Enable=0|ENVI @ITEM322.Enable=0| ENVI @ITEM33.Enable=0| ENVI @ITEM4.Enable=0| ENVI @ITEM5.Enable=0
- EXEC -wait %&::MEXE% -Gx -!resize %Partition1%
- EXEC -wait %&::MEXE% %&BParam% %&OParam%
- EXEC -wait %&::MEXE% -Gx -Y --resize %Partition1% 9999999999999
- DATE
- //%CurDate%中,结果可能是"2024-3-28|4|18:10:36.158"
- SED CurDate=0,[^0-9], ,%CurDate%
- MSTR &C1,&C2,&C3,&C4,&C5,&C6,&C7,&C8=<1*>%CurDate%
- ENVI TimeName=%C1%-%C2%-%C3%_%C5%-%C6%-%C7%
- NAME Image_FileName=%LIST321%
- FILE %Image_path%\%Image_FileName%.sna>>%Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna
- IFEX %Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna,MESS+icon2 磁盘分区差异备份完毕!其备份文件为:%Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna。 @提示:#OK
- IFEX %Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna,! MESS+icon2 磁盘分区差异备份出错! @提示:#OK
- SITE %Image_path%\%Image_FileName%_%TimeName%_%Partition2%.sna,+A+R+S
- ENVI @LIST33.ADDSEL=%LIST321%
- }
- IFEX $%RADI3.Check%=1,
- {
- IFEX %LIST33%,! TEAM MESS+icon6 您尚未指定映像文件或指定的映像文件不存在!@错误 #OK *-5000| EXIT _SUB
- LSTR OsRoot=1,%SystemRoot%
- ENVI WinOS=%&::MEXE% --schedule %Partition1% "%LIST33%" --autoreboot:success -G
- ENVI PeOS=%&::MEXE% "%LIST33%" %Partition1% -G
- FIND $%OsRoot%=C, ENVI RunEXEC1=%WinOS% !ENVI RunEXEC1=%PeOS%
- MESS+icon1 即将把映像文件 %LIST33% 还原至分区 %Partition1% 中。@还原确认 #OKC $C
- FIND $%YESNO%=CANCEL,EXIT _SUB
- TEAM ENVI @LABE4=正在还原分区,请稍等...| ENVI @ITEM21.Enable=0| ENVI @ITEM22.Enable=0| ENVI @ITEM31.Enable=0| ENVI @ITEM321.Enable=0| ENVI @ITEM33.Enable=0| ENVI @ITEM4.Enable=0| ENVI @ITEM5.Enable=0
- EXEC -wait %RunEXEC1%
- EXEC* --cmd::5000:OnNSAMsg &YDXF=!bcdboot %&DrvLtr%\windows /l zh-cn
- FIND $%&YDXF%=已成功创建启动文件。,!EXEC* --cmd::5000:OnNSAMsg &YDXF=!bcdboot %&DrvLtr%\windows /l zh-cn /s %&DrvLtr% /f ALL
- // EXEC =!cmd /c bcdedit.exe /set {default} bootmenupolicy legacy
- // EXEC =!cmd /c bcdedit.exe /timeout 5
- // EXEC =shutdown -r -t 0
- }
- CALL OnTable
- CALL Reset
- TEAM ENVI @LABE4=准备就绪| ENVI @ITEM21.Enable=1| ENVI @ITEM22.Enable=1| ENVI @ITEM31.Enable=1| ENVI @ITEM321.Enable=1| ENVI @ITEM322.Enable=1| ENVI @ITEM33.Enable=1| ENVI @ITEM4.Enable=1| ENVI @ITEM5.Enable=1
- _END
- _SUB ListDrive
- ENVI &PartsList=
- ENVI &WinsList=
- PART list disk ,&DiskList
- FORX * %DiskList%,&DiskNum,
- {
- PART list part %DiskNum%,&PartList
- FORX * %PartList%,&PartNum,
- {
- FIND $%PartNum%=0,EXIT -
- LSTR &aStr=1,%PartNum%
- FIND [ $ "%aStr%"="-" | $ "%aStr%"="=" | $ "%aStr%"="@" ],EXIT -
- PART list part %DiskNum%:%PartNum%,&PartInfo
- MSTR &Letter=<8>%PartInfo%
- FIND $%Letter%=,ENVI &PartsList=%PartsList%|%DiskNum%:%PartNum%!
- {
- ENVI &PartsList=%PartsList%|%Letter%
- IFEX %Letter%\Windows\System32\winload.exe,ENVI &WinsList=%WinsList%%Letter%\Windows|
- }
- }
- }
- ENVI-ret %~1=%PartsList%
- ENVI-ret %~2=%WinsList%
- _END
- _SUB XSPF
- TEAM ENVI @TABL3.Sel=?&&Sel| ENVI @TABL3.Val=?%Sel%.1;&&V1| ENVI @TABL3.Val=?%Sel%.2;&&V2| ENVI @TABL3.Val=?%Sel%.6;&&V6
- IFEX $1>%&Sel%,TEAM MESS+icon6 您尚未选择一个分区!@错误 #OK *-5000| EXIT
- FIND $%&V6%=RAW,TEAM MESS+icon6 RAW文件系统不能作为映像保存分区!@错误 #OK *-5000| EXIT
- ENVI &Options=%&V1%
- SHOW %&Options%
- ENVI @LIST31.ADDSEL=%&V2%\Snap\FullBackup.sna
- ENVI @LIST321.ADDSEL=%&V2%\Snap\DiffBackup.sna
- CALL OnTable
- _END
- _SUB YCPF
- TEAM ENVI @TABL3.Sel=?&&Sel| ENVI @TABL3.Val=?%Sel%.1;&&V1| ENVI @TABL3.Val=?%Sel%.2;&&V2| ENVI @TABL3.Val=?%Sel%.6;&&V6
- IFEX $1>%&Sel%,TEAM MESS+icon6 您尚未选择一个分区!@错误 #OK *-5000| EXIT
- ENVI &Options=%&V1%
- SHOW - %&Options%
- ENVI @LIST31.DEL=%&V2%\Snap\FullBackup.sna
- ENVI @LIST321.DEL=%&V2%\Snap\DiffBackup.sna
- CALL OnTable
- CALL Reset
- _END
- // 【公共设置】
- _SUB Reset
- ENVI @Partition=C:
- ENVI @Image_path=D:
- ENVI @LIST31=D:\Snap\FullBackup.sna
- ENVI @LIST321=D:\Snap\DiffBackup.sna
- _END
复制代码
|
|