dos时代菜鸟 发表于 2022-3-16 16:34:10

系统内运行 脚本实现 a.vhd b.vhd 交替挂载,达到还原目的。

本帖最后由 dos时代菜鸟 于 2022-10-31 21:58 编辑

脚本 针对intel amdx86 /x64 架构。
仅在 win10 ltsc2021h.x64 uefi 环境,vhdx 为单分区,测试正常,其他模式 尚未测试。
支持 vhd 以及 bcd 无盘符情况。

创建 子 vhd 用这个脚本 http://bbs.wuyou.net/forum.php?m ... 425049&fromuid=1198,不需要 diskpart
如何 修改 脚本 适应 自定义的 子vhd 名称,这里就不多说啦,看下面图片,结合,打开 ini配置文件 ,内容一看就明白。

如何把 子 vhd 挂到bcd 菜单启动,可以用bootice

----------------------------------
这是一个 cmd 脚本,用于 修改 bcd 中指向当前vhd系统的启动项 到另一个vhd 。
事先准备好 child_vhd 文件集群,在ini 中设置好 child_vhd 文件名。
运行后,再启动的就是 用另一个 child_vhd 启动的系统,如此实现系统还原功能。

0.vhd 原始备份文件,由源 父vhd 差分 出来的 子 vhd ,体积只有3-5M
a.vhd 当前系统文件,复制于 0.vhd
b.vhd 还原用文件,复制于 0.vhd
如果当前系统 是 通过 a.vhd 启动的,运行脚本后,会通过 0.vhd 复制出一个 b.vhd, 替换到 bcd 中指向 a.vhd 的启动项为 指向 b.vhd ,通常是当前系统启动项。
再启动系统时,就会 通过 b.vhd 启动,相当于系统还原了。
通过b.vhd 启动系统后,如果再次运行脚本,就会 把0.vhd 复制成 a.vhd ,并在 bcd 中把指向 b.vhd 的启动项替换成指向a.vhd
再次启动系统,就会通过 a.vhd 启动,此时 a.vhd 已经是由0.vhd 替换过来的,也是新系统。

--------------------------------
1.42



1.34版,脚本名称为alternate.Child_vhd.cmd 增加 设置文件 alternate.Child_vhd.ini 可以不修改 脚本,只修改配置文件来配置 Child_vhd 文件集群。改进 当 用 /store 获取和修改 bcd 内容时 的一些 细节。

1.41


Ver:1.35


ver:第一版


有vhdx文件 "windows ltsc.2021h2.x64.vhdx" 其 子vhd 为 0.vhdx
由 0.vhdx 分别 复制出a.vhdx 和 b.vhdx

bcd中 引用 a.vhdx 启动后,运行 脚本 ,会 用 0.vhdx 覆盖 b.vhdx 并 将启动指向 b.vhdx ,
如此 ,重启后,将通过 b.vhdx 启动系统。

脚本用到外部命令pecmd ,bcdedit 。

测试环境 win10 ltsc2021h2

话不多说。具体看图 和 脚本内容吧。脚本 里也没几行代码。
















dos时代菜鸟 发表于 2022-3-16 18:56:55

本帖最后由 dos时代菜鸟 于 2022-3-16 19:48 编辑

有些 情况 找不到启动 BCD ,增加了俩功能,判断 当前启动模式 和 bcd 所在分区卷。
应该能应付大部分 情况了。

dos时代菜鸟 发表于 2022-3-16 19:38:32

增加了一些功能,可以 判断 当前启动 模式 bios /uefi
可以找出bcd 启动卷,

一旦 bcdedit /enum {current } 不能实现对bcd 的修改,
可以尝试 用 bcdedit /store bcd文件 的方式 修改 bcd 菜单。
当然,如果 Bcd 不是在特定位置的就无能为力了,
比如
leagcy 的bcd 应该在 特定分区的\boot\
uefi 的 bcd 应该在 \efi\microsoft\boot\

ddnflier 发表于 2022-3-17 07:30:27

看起来很强大,支持下

wcs 发表于 2022-3-17 07:56:20

学习了

dos时代菜鸟 发表于 2022-3-17 09:20:40

1.34版,脚本名称为alternate.Child_vhd.cmd 增加 设置文件 alternate.Child_vhd.ini 可以不修改 脚本,只修改配置文件来配置 Child_vhd 文件集群。
改进 当 用 /store 获取和修改 bcd 内容时 的一些 细节。

dos时代菜鸟 发表于 2022-3-17 09:48:11

刚测试 在win7 x64 bios 环境 以 /store 方式修改 bcd,正常成功。

天使说请安静 发表于 2022-3-17 09:56:53

过来学习,顶一个

caocaofff 发表于 2022-3-17 10:04:00

看截图是支持UEFI的,不错,可以被借鉴做成全自动化重启还原

dos时代菜鸟 发表于 2022-3-17 10:31:18

本帖最后由 dos时代菜鸟 于 2022-3-17 10:35 编辑

caocaofff 发表于 2022-3-17 10:04
看截图是支持UEFI的,不错,可以被借鉴做成全自动化重启还原
是的,做这个玩意儿,最初目的 就是 这个。
ini 配置文件中 把 debug 设置成 =off就 可以没有 pause 等待了。

dos时代菜鸟 发表于 2022-3-17 10:56:01

天使说请安静 发表于 2022-3-17 09:56
过来学习,顶一个

互相学习

useQQqqq99 发表于 2022-3-17 11:27:50

这个玩意儿目的,就是不错的

dos时代菜鸟 发表于 2022-3-17 11:35:52

全都倚仗 pecmd 对硬盘分区、卷 信息的搜集。

dos时代菜鸟 发表于 2022-3-18 18:06:00

基本稳定,不再更新啦。

wawakuliao 发表于 2022-3-18 20:46:46

感谢分享

2011bialau 发表于 2022-3-19 09:04:05

必须收藏,很好的方案。

netfoxs 发表于 2022-3-20 00:01:52

问一下,你这个方式,如果系统内安装的应用比较多,复制vhd的时候花的时间是不是会比较长时间,这样就照成系统恢复的时间可能会比较长。效率方面远不如冰点还原、影子系统之类的软件。如果是偶尔用一下还好,经常用的话我觉得不是很实用。

dos时代菜鸟 发表于 2022-3-21 08:07:58

本帖最后由 dos时代菜鸟 于 2022-3-21 08:17 编辑

netfoxs 发表于 2022-3-20 00:01
问一下,你这个方式,如果系统内安装的应用比较多,复制vhd的时候花的时间是不是会比较长时间,这样就照成 ...
很显然,你没有理解 vhd 差分子vhd 的技术概念。

子vhd 复制 并不耗时,因为 最基本的 子vhd 都是 扩展类型的,通常只有 3-5M,提前准备好   只有 3-5M 的 0.vhd ,用来 覆盖复制 a.vhd 或者 b.vhd ,覆盖复制时, 瞬间完成。
你可以把 现有系统 的 vhd 差分出一个子vhd ,就命名 为0.vhd ,这个 0.vhd 很小,然后再 把 0.vhd 复制成 a.vhd,设置到 bcd 启动项 中,用 a.vhd 启动。当需要 还原时,直接 运行 脚本,就 会 把 0.vhd 复制成 b.vhd 并修改 bcd 菜单由b.vhd 启动。通过 b.vhd 启动后,可以删除 a.vhd ,但不要删除 0.vhd .


这里的重点技术是 如何准确 定位 bcd 中的菜单项 以及 vhd 路径表达式,然后 依靠 bcdedit 修改bcd 菜单数据。



zmyzbf 发表于 2022-3-21 22:29:00

uefi下可以吗,或者ventoy下能不能实现

dos时代菜鸟 发表于 2022-3-21 23:22:08

zmyzbf 发表于 2022-3-21 22:29
uefi下可以吗,或者ventoy下能不能实现

UEFI bcd 测试过,可以的,
ventoy 没试过,需要自己玩儿。

netfoxs 发表于 2022-3-21 23:35:34

dos时代菜鸟 发表于 2022-3-21 08:07
很显然,你没有理解 vhd 差分子vhd 的技术概念。

子vhd 复制 并不耗时,因为 最基本的 子vhd 都是 扩 ...

学到了,谢谢!

2010wadee 发表于 2022-3-22 18:54:31

谢谢大师研究~收藏学习

oym2016 发表于 2022-3-23 11:20:54

dos时代菜鸟 发表于 2022-3-17 11:35
全都倚仗 pecmd 对硬盘分区、卷 信息的搜集。

大大的C.vhd_path.pecmd 是花了不少心思 获取信息.

用这简单的方法获得也行:
一级目录下:FOR /f,"tokens=1,2 delims=\",%%i,In ("%~dp0") Do (SET vhd_part=[%%i]&SET vhd_path=%%~pj)
   BCDEDIT /set %ID% osdevice vhd=%vhd_part%%vhd_path%BaseSub_1.vhdx

dos时代菜鸟 发表于 2022-3-23 15:42:41

本帖最后由 dos时代菜鸟 于 2022-3-23 18:06 编辑

oym2016 发表于 2022-3-23 11:20
大大的C.vhd_path.pecmd 是花了不少心思 获取信息.

用这简单的方法获得也行:

有些BCD启动,很特殊,不能单靠 BCDEDIT ,
BCDEDIT 是通过setup API方式获取 BCD文件位置,而,有些情况,是获取不到的,有些是GRUB引导跳转的,就必须用 BCDEDIT /SOTRE 方式 打开特定位置的BCD。

dos时代菜鸟 发表于 2022-3-23 15:50:52

oym2016 发表于 2022-3-23 11:20
大大的C.vhd_path.pecmd 是花了不少心思 获取信息.

用这简单的方法获得也行:


还有一些 bcd 文件在隐藏分区,没有盘符的分区,vhd 在无盘符的分区,隐藏分区,等情况,必须考虑。

qq328 发表于 2022-3-23 16:13:39

谢谢

xman00 发表于 2022-3-27 19:52:01

感谢分享,很厉害

hoder 发表于 2022-4-10 00:43:19

有做过vbs脚本,也是利用vhd差分,启动项设置好正常启动和系统恢复两个选项就行,这样的好处是不会每次重启都恢复成一个“新”系统,比如软件测试之类需要重启电脑的。而需要恢复的时候,开机选“系统恢复”就行,每次进桌面脚本会自动处理,不会占用额外的时间。半成品算是写出来了,目前只能自己用,因为发现有些情况下会失效(不是专业搞这个的,启动方面实在不懂),而目前又没有能力测试和维护。
仅用bcdedit确实不好处理一些问题,头疼。

dos时代菜鸟 发表于 2022-4-10 09:14:20

hoder 发表于 2022-4-10 00:43
有做过vbs脚本,也是利用vhd差分,启动项设置好正常启动和系统恢复两个选项就行,这样的好处是不会每次重启 ...

必须 通过 api + reg 获取 注册表 中特定位置 记录的bcd 引导分区的位置。而且 这个位置 必须转换成 bcdedit 能用的。
所以 我考虑用成型的pecmd 脚本。

至于 启动即还原 ,可以考虑 手动 运行脚本,而不是 放到 启动里。即使还原了,上一系统 vhd 仍然存在,还有读取 的机会,相当于给自己留了个后悔药,避免 因为还原导致 后悔。

hoder 发表于 2022-4-15 23:00:22

这几天写出来了,单bat操作,望测评反馈,谢谢!!!

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=429912&page=1&extra=#pid4542088
页: [1] 2 3
查看完整版本: 系统内运行 脚本实现 a.vhd b.vhd 交替挂载,达到还原目的。