无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 21728|回复: 103
打印 上一主题 下一主题

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

    [复制链接]
跳转到指定楼层
1#
发表于 2022-3-16 16:34:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dos时代菜鸟 于 2022-10-31 21:58 编辑

脚本 针对  intel amd  x86 /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
alternate.vhd_c.script.Ver_1.42.7z (2.92 MB, 下载次数: 197)


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

1.41
alternate.vhd_c.script.Ver_1.41.7z (1.76 MB, 下载次数: 46)

Ver:  1.35
alternate.vhd_c.script.Ver_1.38.7z (1.76 MB, 下载次数: 357)

ver:第一版
alternate.vhd_c.script.7z (1.75 MB, 下载次数: 192)

有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

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
















评分

参与人数 1无忧币 +5 收起 理由
vrboxing + 5

查看全部评分

2#
 楼主| 发表于 2022-3-16 18:56:55 来自手机 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-3-16 19:48 编辑

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

使用道具 举报

3#
 楼主| 发表于 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\
回复

使用道具 举报

4#
发表于 2022-3-17 07:30:27 | 只看该作者
看起来很强大,支持下
回复

使用道具 举报

5#
发表于 2022-3-17 07:56:20 | 只看该作者
学习了
回复

使用道具 举报

6#
 楼主| 发表于 2022-3-17 09:20:40 | 只看该作者
1.34版,脚本名称为alternate.Child_vhd.cmd 增加 设置文件 alternate.Child_vhd.ini 可以不修改 脚本,只修改配置文件来配置 Child_vhd 文件集群。
改进 当 用 /store 获取和修改 bcd 内容时 的一些 细节。
回复

使用道具 举报

7#
 楼主| 发表于 2022-3-17 09:48:11 | 只看该作者
刚测试 在  win7 x64 bios 环境 以 /store 方式修改 bcd,正常成功。
回复

使用道具 举报

8#
发表于 2022-3-17 09:56:53 | 只看该作者
过来学习,顶一个

点评

互相学习  详情 回复 发表于 2022-3-17 10:56
回复

使用道具 举报

9#
发表于 2022-3-17 10:04:00 | 只看该作者
看截图是支持UEFI的,不错,可以被借鉴做成全自动化重启还原

点评

是的,做这个玩意儿,最初目的 就是 这个。  详情 回复 发表于 2022-3-17 10:31
回复

使用道具 举报

10#
 楼主| 发表于 2022-3-17 10:31:18 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-3-17 10:35 编辑
caocaofff 发表于 2022-3-17 10:04
看截图是支持UEFI的,不错,可以被借鉴做成全自动化重启还原

是的,做这个玩意儿,最初目的 就是 这个。
ini 配置文件中 把 debug 设置成 =off就 可以没有 pause 等待了。
回复

使用道具 举报

11#
 楼主| 发表于 2022-3-17 10:56:01 | 只看该作者

互相学习
回复

使用道具 举报

12#
发表于 2022-3-17 11:27:50 | 只看该作者
这个玩意儿目的,就是不错的
回复

使用道具 举报

13#
 楼主| 发表于 2022-3-17 11:35:52 | 只看该作者
全都倚仗 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%  详情 回复 发表于 2022-3-23 11:20
回复

使用道具 举报

14#
 楼主| 发表于 2022-3-18 18:06:00 | 只看该作者
基本稳定,不再更新啦。
回复

使用道具 举报

15#
发表于 2022-3-18 20:46:46 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

16#
发表于 2022-3-19 09:04:05 | 只看该作者
必须收藏,很好的方案。
回复

使用道具 举报

17#
发表于 2022-3-20 00:01:52 | 只看该作者
问一下,你这个方式,如果系统内安装的应用比较多,复制vhd的时候花的时间是不是会比较长时间,这样就照成系统恢复的时间可能会比较长。效率方面远不如冰点还原、影子系统之类的软件。如果是偶尔用一下还好,经常用的话我觉得不是很实用。

点评

vhd 复制 并不好时,因为 最基本的 子vhd 都是 扩展类型的,通常只有 3-5M  详情 回复 发表于 2022-3-21 08:07
回复

使用道具 举报

18#
 楼主| 发表于 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 菜单数据。



回复

使用道具 举报

19#
发表于 2022-3-21 22:29:00 | 只看该作者
uefi下可以吗,或者ventoy下能不能实现

点评

UEFI bcd 测试过,可以的, ventoy 没试过,需要自己玩儿。  详情 回复 发表于 2022-3-21 23:22
回复

使用道具 举报

20#
 楼主| 发表于 2022-3-21 23:22:08 来自手机 | 只看该作者
zmyzbf 发表于 2022-3-21 22:29
uefi下可以吗,或者ventoy下能不能实现

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

使用道具 举报

21#
发表于 2022-3-21 23:35:34 | 只看该作者
dos时代菜鸟 发表于 2022-3-21 08:07
很显然,你没有理解 vhd 差分子vhd 的技术概念。

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

学到了,谢谢!
回复

使用道具 举报

22#
发表于 2022-3-22 18:54:31 | 只看该作者
谢谢大师研究~收藏学习
回复

使用道具 举报

23#
发表于 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

点评

还有一些 bcd 文件在隐藏分区,没有盘符的分区,vhd 在无盘符的分区,隐藏分区,等情况,必须考虑。  详情 回复 发表于 2022-3-23 15:50
有些BCD启动,很特殊,不能单靠 BCDEDIT , BCDEDIT 是通过 setup API方式获取 BCD文件位置,而,有写情况,是获取不到的,有些是GRUB引导跳转的,就必须用 BCDEDIT /SOTRE 方式 打开特定位置的BCD。  详情 回复 发表于 2022-3-23 15:42
回复

使用道具 举报

24#
 楼主| 发表于 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。
回复

使用道具 举报

25#
 楼主| 发表于 2022-3-23 15:50:52 来自手机 | 只看该作者
oym2016 发表于 2022-3-23 11:20
大大的C.vhd_path.pecmd 是花了不少心思 获取信息.

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

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

使用道具 举报

26#
发表于 2022-3-23 16:13:39 来自手机 | 只看该作者
谢谢
回复

使用道具 举报

27#
发表于 2022-3-27 19:52:01 来自手机 | 只看该作者
感谢分享,很厉害
回复

使用道具 举报

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

点评

必须 通过 api + reg 获取 注册表 中特定位置 记录的 bcd 引导分区的位置。而且 这个位置 必须转换成 bcdedit 能用的。 所以 我考虑用 成型的 pecmd 脚本。 至于 启动即还原 ,可以考虑 手动 运行脚本,而不  详情 回复 发表于 2022-4-10 09:14
回复

使用道具 举报

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

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

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

使用道具 举报

30#
发表于 2022-4-15 23:00:22 | 只看该作者
这几天写出来了,单bat操作,望测评反馈,谢谢!!!

http://bbs.wuyou.net/forum.php?m ... p;extra=#pid4542088
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-30 23:50

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表