无忧启动论坛

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

用 pecmd 创建、挂载、卸载 vhd 的脚本(不依赖diskpart)

    [复制链接]
跳转到指定楼层
1#
发表于 2021-4-29 11:21:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dos时代菜鸟 于 2022-4-20 12:24 编辑

1.15.5 单文件版
One_VHDx_script.1.15.5.7z (1.41 MB, 下载次数: 614)

1.15
One_VHDx_script-1.15.4y.7z (1.4 MB, 下载次数: 550)
1.15 2021.05.27
1.利用新版 pecmd(2021.05.26测试版) 可以创建差分 vhd 。
2.改进右键机制,
    右键分区并选择 One_vhd,尝试卸载,
    右键空白并选择 one_vhd ,自动跳转到创建vhd界面,
    右键文件并选择 one_vhd ,自动跳转加载vhd界面,如果手动选择创建页,会自动将该文件作为上级Vhd用于创建同目录下的差分Vhd.
3.支持创建无扩展名的 vhd 及其差分 .



1.12

用 tabs 实现界面更简捷了一些,
改进延迟 相关内容,
卸载vhd前 先 卸载盘符,避免遗留失效盘符, 装载时 增加 延迟判断,能够更准确获取 装载的盘符。


1.10
改进功能,可以挂载vhd的同时为vhd中全部可识别的未分配盘符的分区分配盘符。
1.07
支持附带参数,可以拖放文件或分区到批处理,就能看到效果。

不依赖 diskpart ,只用到 pecmd 2012
200行代码,需要的拿去,绝对开源。


利用 pecmd 挂载、卸载、创建vhd
1.创建vhd ,对vhd分区,根据设置划分一个分区并格式化为指定格式,然后,为这个分区分配一个盘符。
2.不支持创建子vhd
3.挂载vhd ,如果vhd 的第一个分区可识别而又没有被分配盘符,会自动为其分配盘符。

评分

参与人数 2无忧币 +7 收起 理由
vrboxing + 5 很给力!
anythingsky + 2 赞一个!

查看全部评分

2#
 楼主| 发表于 2021-4-29 11:25:44 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-4-30 09:44 编辑

尚需完善,
没有判断 vhd 是否已经被挂载,(已经更新 实现)
没能将 vhd 中所有 可识别分区挂上盘符(已经实现,Ver1.10)
不支持 定义多个分区(这个功能恐怕 会复杂一些)

可以加强但还没实现的地方:
可以设置接受参数,根据参数判断是 vhd 文件还是 某个分区,如果是 Vhd 文件,就挂载之,如果是某个分区而该分区恰恰是 vhd 挂载上的,就卸载Vhd。
(已经实现  并可集成到右键菜单 ver:1.07)



希望能够增加的功能:
支持创建 差分vhd ,但是 pecmd 好像还没有这个能力。

点评

学习了  详情 回复 发表于 2021-4-30 11:19
回复

使用道具 举报

3#
发表于 2021-4-29 12:03:46 | 只看该作者
差分估计要研究数据结构,自己用PECMD造数据了

点评

如果用 api 能不能实现呢  详情 回复 发表于 2021-4-29 13:26
回复

使用道具 举报

4#
 楼主| 发表于 2021-4-29 13:26:29 | 只看该作者
caocaofff 发表于 2021-4-29 12:03
差分估计要研究数据结构,自己用PECMD造数据了

如果用 api 能不能实现呢

点评

有相关API文档吗  详情 回复 发表于 2021-4-29 22:20
回复

使用道具 举报

5#
 楼主| 发表于 2021-4-29 13:27:24 | 只看该作者
刚更新了一下,可以搜集当前已经挂载的 vhd 的信息。有助于实现初步的判断。
回复

使用道具 举报

6#
 楼主| 发表于 2021-4-29 13:29:47 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-4-29 13:32 编辑

这个东西 主要针对 包含一个分区的 vhd 设计。
就是 为做 vhd 系统玩儿的。

pecmd 可以 对没有 扩展名的 vhd 进行挂载。

回复

使用道具 举报

7#
 楼主| 发表于 2021-4-29 15:47:50 | 只看该作者
更新下,可以支持附带参数。如果能将此集成到右键中,就更方便了。
1.05
增加算法,
增加可接收参数,
如果传递过来的参数是目录,就判断目所所在分区是否为VHDx挂载分区,如果是,就卸载VHDx
如果传递过来的是文件,就判断文件是否被挂载,如果是,就卸载之,如果没挂载,就挂载之。

把 一个 vhdx 拖放到 One_vhd.cmd 上,或者 把一个 分区或目录 拖放到 One_vhd.cmd 上就可以看到效果。

回复

使用道具 举报

8#
 楼主| 发表于 2021-4-29 20:17:08 | 只看该作者
能罗列出当前都有哪些VHD被挂载了,第一分区挂载到那个盘符了。
这样可以方便卸载。
回复

使用道具 举报

9#
 楼主| 发表于 2021-4-29 21:41:44 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-4-29 22:02 编辑

更新 1.07 增加一个 可以集成到右键菜单 的 批处理
右键 vhd(x) 文件 或者 分区,就会在右键菜单 有功能项目对应。

回复

使用道具 举报

10#
发表于 2021-4-29 21:44:44 | 只看该作者
谢谢分享
回复

使用道具 举报

11#
发表于 2021-4-29 22:20:59 | 只看该作者
dos时代菜鸟 发表于 2021-4-29 13:26
如果用 api 能不能实现呢

有相关API文档吗

点评

大概就是这个吧,天书一样。 VirtDisk.dll https://docs.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-createvirtualdisk  详情 回复 发表于 2021-4-29 23:01
没有 我现在等同于 C语言盲 估计要找 微软 技术网站了。  详情 回复 发表于 2021-4-29 22:29
回复

使用道具 举报

12#
 楼主| 发表于 2021-4-29 22:29:01 | 只看该作者

没有
我现在等同于 C语言盲
估计要找 微软  技术网站了。

点评

有API,用PECMD一样可以写的  详情 回复 发表于 2021-4-29 23:01
回复

使用道具 举报

13#
 楼主| 发表于 2021-4-29 23:01:01 | 只看该作者

大概就是这个吧,天书一样。
VirtDisk.dll

https://docs.microsoft.com/en-us ... k-createvirtualdisk
回复

使用道具 举报

14#
发表于 2021-4-29 23:01:30 | 只看该作者
dos时代菜鸟 发表于 2021-4-29 22:29
没有
我现在等同于 C语言盲
估计要找 微软  技术网站了。

有API,用PECMD一样可以写的

点评

大概就是这个吧,天书一样。 VirtDisk.dll https://docs.microsoft.com/en-us ... k-createvirtualdisk 其实应该是同一个函数 ,只是 多了一个 parent 的 上级vhd 的指向,具体 api 如何调用,如何写,我是  详情 回复 发表于 2021-4-29 23:07
回复

使用道具 举报

15#
 楼主| 发表于 2021-4-29 23:07:22 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-4-29 23:23 编辑
红毛樱木 发表于 2021-4-29 23:01
有API,用PECMD一样可以写的

大概就是这个吧,天书一样。
VirtDisk.dll

https://docs.microsoft.com/en-us ... k-createvirtualdisk

其实应该是同一个函数 ,只是 多了一个 parent 的 上级vhd 的指向,具体 api 如何调用,如何写,我是一窍不通呀。

这个脚本倒是可以不涉及 创建 差分Vhd,但是在 系统安装方面,用处就大了,可以变相实现一键还原。

点评

随便翻了一下没找到差分的关键词,你找一下吧,找到给M,这个他把功能内置到PECMD里应该很简单,就是找资料麻烦。  详情 回复 发表于 2021-4-29 23:20
回复

使用道具 举报

16#
发表于 2021-4-29 23:20:13 | 只看该作者
dos时代菜鸟 发表于 2021-4-29 23:07
大概就是这个吧,天书一样。
VirtDisk.dll

随便翻了一下没找到差分的关键词,你找一下吧,找到给M,这个他把功能内置到PECMD里应该很简单,就是找资料麻烦。

点评

我能找到的 也就是这个了 https://docs.microsoft.com/en-us/windows/win32/api/virtdisk/ 那里面有个 用于设置 parentPath 的函数,估计是 创建 vhd 前用于设置数据结构用的,可以指定新Vhd对应的 父vhd 的路径  详情 回复 发表于 2021-5-4 09:31
好吧,我找找看, 关键是我也不太明白呀。估计也是不好找  详情 回复 发表于 2021-4-29 23:24
回复

使用道具 举报

17#
 楼主| 发表于 2021-4-29 23:24:02 | 只看该作者
红毛樱木 发表于 2021-4-29 23:20
随便翻了一下没找到差分的关键词,你找一下吧,找到给M,这个他把功能内置到PECMD里应该很简单,就是找资 ...

好吧,我找找看,
关键是我也不太明白呀。估计也是不好找
回复

使用道具 举报

18#
 楼主| 发表于 2021-4-30 09:45:08 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-4-30 11:04 编辑

又 更新了一下 可以 在 挂载 vhd 的同时 将其中的 可识别而又没有盘符的分区 全部分配盘符。

Ver 1.10
配合右键适用,非常方便。




回复

使用道具 举报

19#
发表于 2021-4-30 11:19:21 | 只看该作者
dos时代菜鸟 发表于 2021-4-29 11:25
尚需完善,
没有判断 vhd 是否已经被挂载,(已经更新 实现)
没能将 vhd 中所有 可识别分区挂上盘符(已 ...

学习了
回复

使用道具 举报

20#
 楼主| 发表于 2021-4-30 13:03:45 | 只看该作者
根据当前系统位数直接把 对应的指令 " pecmd.exe load one_vhd.ini %1 "添加到右键的批处理
支持通过 右键 把*.* 文件 当成 vhdx 挂载,当然如果文件 不是 虚拟盘文件,会反馈加载失败。

  1. @echo off
  2. title One_vhd(添加/删除右键菜单)
  3. echo.
  4. SET /P ST=输入 A 添加右键菜单,输入 D 删除右键菜单:
  5. if /I "%ST: =%"=="a" call:Add
  6. if /I "%ST: =%"=="d" call:Remove
  7. pause
  8. exit

  9. :Add
  10. set "pecmd=%~sdp0tools\x%PROCESSOR_ARCHITECTURE:~-2%\pecmd.exe"
  11. set "pecmd_script=%~sdp0script_x\one_vhd.ini"
  12. set reg_cmd=""%pecmd%" load "%pecmd_script%" "%%1""

  13. echo.
  14. echo vhd
  15. reg add "HKEY_CLASSES_ROOT\.vhd\shell\ONE_VHD" /ve /t REG_SZ /d "用 &One_VHD 加载" /f
  16. reg add "HKEY_CLASSES_ROOT\.vhd\shell\ONE_VHD\command" /ve /t REG_SZ /d %reg_cmd% /f
  17. echo.
  18. echo vhdx
  19. reg add "HKEY_CLASSES_ROOT\.vhdx\shell\ONE_VHD" /ve /t REG_SZ /d "用 &One_VHD 加载" /f
  20. reg add "HKEY_CLASSES_ROOT\.vhdx\shell\ONE_VHD\command" /ve /t REG_SZ /d %reg_cmd% /f
  21. echo.
  22. echo Drive
  23. reg add "Hkey_classes_ROOT\Drive\shell\One_VHD" /ve /t REG_SZ /d "用 &One_VHD 卸载" /f
  24. reg add "Hkey_classes_ROOT\Drive\shell\One_VHD\command" /ve /t REG_SZ /d %reg_cmd% /f

  25. echo.
  26. echo *
  27. reg add "HKEY_CLASSES_ROOT\*\shell\ONE_VHD" /ve /t REG_SZ /d "用 &One_VHD 加载" /f
  28. reg add "HKEY_CLASSES_ROOT\*\shell\ONE_VHD\command" /ve /t REG_SZ /d %reg_cmd% /f


  29. exit /b
  30. :Remove
  31. reg delete "HKEY_CLASSES_ROOT\.vhd\shell\ONE_VHD" /f
  32. reg delete "HKEY_CLASSES_ROOT\.vhdx\shell\ONE_VHD" /f
  33. reg delete "Hkey_classes_ROOT\Drive\shell\One_VHD" /f
  34. reg delete "HKEY_CLASSES_ROOT\*\shell\ONE_VHD" /f

  35. exit /b
复制代码
回复

使用道具 举报

21#
 楼主| 发表于 2021-5-4 09:31:34 | 只看该作者
红毛樱木 发表于 2021-4-29 23:20
随便翻了一下没找到差分的关键词,你找一下吧,找到给M,这个他把功能内置到PECMD里应该很简单,就是找资 ...

我能找到的 也就是这个了
https://docs.microsoft.com/en-us/windows/win32/api/virtdisk/

那里面有个 用于设置 parentPath 的函数,估计是 创建 vhd 前用于设置数据结构用的,可以指定新Vhd对应的 父vhd 的路径,也就是设定 这个新 Vhd 是一个 子vhd 。
具体的我也不是十分明白。

另外看 pecmd 的 moun 指令,貌似能够检测到 子Vhd 对应的 父vhd  的路径,我们的 pecmd 2012 该对这方面的 函数和 api 很是了解,大神如果能参考pecmd 源码,实现 用 pecmd 创建 子 vhd 应该是可以实现的。
回复

使用道具 举报

22#
发表于 2021-5-8 22:04:59 | 只看该作者
非常感谢!膜拜!
回复

使用道具 举报

23#
 楼主| 发表于 2021-5-10 12:08:04 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-5-10 20:52 编辑

pecmd 对硬盘初始化的指令 如果没有指定 硬盘号,就默认处理第一个硬盘、
所以 ,如果 虚拟盘创建时 失败,没有进行判断,脚本会在 没有指定 盘号的情况下  对 当前第一硬盘进行初始化,会导致 硬盘分区丢失。
造成创建虚拟盘失败 的原因主要是  文件名错误、大小输入不对 等等。
为了避免这个问题,我小更新了一下。放在了一楼。1.12.1
回复

使用道具 举报

24#
发表于 2021-5-10 20:22:52 | 只看该作者
比较了一下没有,是diskpart快些还是这个快些?

点评

这个快,快很多。  详情 回复 发表于 2021-5-10 20:36
回复

使用道具 举报

25#
 楼主| 发表于 2021-5-10 20:36:23 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-5-10 20:50 编辑
hhh333 发表于 2021-5-10 20:22
比较了一下没有,是diskpart快些还是这个快些?

这个快,快很多。
对于 含有 pecmd 的系统,只需要一个脚本 就可以实现。
pecmd 直接调用 dll ,要比 diskpart 装入节省时间,有的 vds 服务没有开启,diskpart 启动就会慢很多。

点评

那就好,你那代码看起来费劲,如果只是建立一个Y盘如原来用diskpart是这样的 ENVI load_vhd=(echo create vdisk file="%SystemRoot%\System32\Y.vhd" maximum=15 TYPE=FIXED &echo select vdisk file="%SystemRoot%  详情 回复 发表于 2021-5-11 18:15
回复

使用道具 举报

26#
发表于 2021-5-11 18:15:40 | 只看该作者
dos时代菜鸟 发表于 2021-5-10 20:36
这个快,快很多。
对于 含有 pecmd 的系统,只需要一个脚本 就可以实现。
pecmd 直接调用 dll ,要比 di ...

那就好,你那代码看起来费劲,如果只是建立一个Y盘如原来用diskpart是这样的
ENVI load_vhd=(echo create vdisk file="%SystemRoot%\System32\Y.vhd" maximum=15 TYPE=FIXED &echo select vdisk file="%SystemRoot%\system32\Y.vhd" &echo attach vdisk &echo create partition primary &echo format fs=ntfs label=vhd quick &echo assign letter=Y &echo exit)
EXEC =!cmd /c "%load_vhd% |diskpart"
要如何改?
回复

使用道具 举报

27#
 楼主| 发表于 2021-5-11 20:12:09 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-5-11 20:17 编辑
hhh333 发表于 2021-5-11 18:15
那就好,你那代码看起来费劲,如果只是建立一个Y盘如原来用diskpart是这样的
ENVI load_vhd=(echo creat ...

这个创建的 是扩展类型的,要创建 fixed 需要 该一下。cmd1 的内容 带 -d 参数,就是动态的。

y_vhd.zip (768 Bytes, 下载次数: 17)

点评

这么复杂,太麻烦了。对part命令不熟,创建的VHD全部空间只建一个主分区,要这么复杂吗? 还有就是64k干吗用的?必须要吗?如果格成FAT格式呢?  详情 回复 发表于 2021-5-11 20:42
回复

使用道具 举报

28#
发表于 2021-5-11 20:42:58 | 只看该作者
dos时代菜鸟 发表于 2021-5-11 20:12
这个创建的 是扩展类型的,要创建 fixed 需要 该一下。cmd1 的内容 带 -d 参数,就是动态的。

这么复杂,太麻烦了。对part命令不熟,创建的VHD全部空间只建一个主分区,要这么复杂吗?
还有就是64k干吗用的?必须要吗?如果格成FAT格式呢?

点评

一个分区出来了,多个分区就简单了。  详情 回复 发表于 2021-5-12 08:18
64K 是分区的起始位置。 创建分区稍显麻烦。 主要还是挂载个卸载功能。  详情 回复 发表于 2021-5-11 21:07
回复

使用道具 举报

29#
 楼主| 发表于 2021-5-11 21:07:49 来自手机 | 只看该作者
本帖最后由 dos时代菜鸟 于 2021-5-11 21:09 编辑
hhh333 发表于 2021-5-11 20:42
这么复杂,太麻烦了。对part命令不熟,创建的VHD全部空间只建一个主分区,要这么复杂吗?
还有就是64k干 ...


64K 是分区的起始位置。
创建分区稍显麻烦。
主要还是挂载跟卸载功能。
回复

使用道具 举报

30#
 楼主| 发表于 2021-5-12 08:18:54 | 只看该作者
hhh333 发表于 2021-5-11 20:42
这么复杂,太麻烦了。对part命令不熟,创建的VHD全部空间只建一个主分区,要这么复杂吗?
还有就是64k干 ...

一个分区出来了,多个分区就简单了。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-25 14:17

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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