dos时代菜鸟 发表于 2021-4-29 11:21:37

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

本帖最后由 dos时代菜鸟 于 2022-4-20 12:24 编辑

1.15.5 单文件版


1.15

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 的第一个分区可识别而又没有被分配盘符,会自动为其分配盘符。

dos时代菜鸟 发表于 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 好像还没有这个能力。

caocaofff 发表于 2021-4-29 12:03:46

差分估计要研究数据结构,自己用PECMD造数据了https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif

dos时代菜鸟 发表于 2021-4-29 13:26:29

caocaofff 发表于 2021-4-29 12:03
差分估计要研究数据结构,自己用PECMD造数据了

如果用 api 能不能实现呢

dos时代菜鸟 发表于 2021-4-29 13:27:24

刚更新了一下,可以搜集当前已经挂载的 vhd 的信息。有助于实现初步的判断。

dos时代菜鸟 发表于 2021-4-29 13:29:47

本帖最后由 dos时代菜鸟 于 2021-4-29 13:32 编辑

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

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

dos时代菜鸟 发表于 2021-4-29 15:47:50

更新下,可以支持附带参数。如果能将此集成到右键中,就更方便了。
1.05
增加算法,
增加可接收参数,
如果传递过来的参数是目录,就判断目所所在分区是否为VHDx挂载分区,如果是,就卸载VHDx
如果传递过来的是文件,就判断文件是否被挂载,如果是,就卸载之,如果没挂载,就挂载之。

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

dos时代菜鸟 发表于 2021-4-29 20:17:08

能罗列出当前都有哪些VHD被挂载了,第一分区挂载到那个盘符了。
这样可以方便卸载。

dos时代菜鸟 发表于 2021-4-29 21:41:44

本帖最后由 dos时代菜鸟 于 2021-4-29 22:02 编辑

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

vaf 发表于 2021-4-29 21:44:44

谢谢分享

红毛樱木 发表于 2021-4-29 22:20:59

dos时代菜鸟 发表于 2021-4-29 13:26
如果用 api 能不能实现呢

有相关API文档吗

dos时代菜鸟 发表于 2021-4-29 22:29:01

红毛樱木 发表于 2021-4-29 22:20
有相关API文档吗

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

dos时代菜鸟 发表于 2021-4-29 23:01:01

红毛樱木 发表于 2021-4-29 22:20
有相关API文档吗

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

https://docs.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-createvirtualdisk

红毛樱木 发表于 2021-4-29 23:01:30

dos时代菜鸟 发表于 2021-4-29 22:29
没有
我现在等同于 C语言盲
估计要找 微软技术网站了。

有API,用PECMD一样可以写的

dos时代菜鸟 发表于 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,但是在 系统安装方面,用处就大了,可以变相实现一键还原。

红毛樱木 发表于 2021-4-29 23:20:13

dos时代菜鸟 发表于 2021-4-29 23:07
大概就是这个吧,天书一样。
VirtDisk.dll



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

dos时代菜鸟 发表于 2021-4-29 23:24:02

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

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

dos时代菜鸟 发表于 2021-4-30 09:45:08

本帖最后由 dos时代菜鸟 于 2021-4-30 11:04 编辑

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

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




2011slkj 发表于 2021-4-30 11:19:21

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

学习了

dos时代菜鸟 发表于 2021-4-30 13:03:45

根据当前系统位数直接把 对应的指令 " pecmd.exe load one_vhd.ini %1 "添加到右键的批处理
支持通过 右键 把*.* 文件 当成 vhdx 挂载,当然如果文件 不是 虚拟盘文件,会反馈加载失败。

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

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

echo.
echo vhd
reg add "HKEY_CLASSES_ROOT\.vhd\shell\ONE_VHD" /ve /t REG_SZ /d "用 &One_VHD 加载" /f
reg add "HKEY_CLASSES_ROOT\.vhd\shell\ONE_VHD\command" /ve /t REG_SZ /d %reg_cmd% /f
echo.
echo vhdx
reg add "HKEY_CLASSES_ROOT\.vhdx\shell\ONE_VHD" /ve /t REG_SZ /d "用 &One_VHD 加载" /f
reg add "HKEY_CLASSES_ROOT\.vhdx\shell\ONE_VHD\command" /ve /t REG_SZ /d %reg_cmd% /f
echo.
echo Drive
reg add "Hkey_classes_ROOT\Drive\shell\One_VHD" /ve /t REG_SZ /d "用 &One_VHD 卸载" /f
reg add "Hkey_classes_ROOT\Drive\shell\One_VHD\command" /ve /t REG_SZ /d %reg_cmd% /f

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


exit /b
:Remove
reg delete "HKEY_CLASSES_ROOT\.vhd\shell\ONE_VHD" /f
reg delete "HKEY_CLASSES_ROOT\.vhdx\shell\ONE_VHD" /f
reg delete "Hkey_classes_ROOT\Drive\shell\One_VHD" /f
reg delete "HKEY_CLASSES_ROOT\*\shell\ONE_VHD" /f

exit /b

dos时代菜鸟 发表于 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 应该是可以实现的。

robincai 发表于 2021-5-8 22:04:59

非常感谢!膜拜!

dos时代菜鸟 发表于 2021-5-10 12:08:04

本帖最后由 dos时代菜鸟 于 2021-5-10 20:52 编辑

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

hhh333 发表于 2021-5-10 20:22:52

比较了一下没有,是diskpart快些还是这个快些?

dos时代菜鸟 发表于 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 启动就会慢很多。

hhh333 发表于 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"
要如何改?

dos时代菜鸟 发表于 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 参数,就是动态的。

hhh333 发表于 2021-5-11 20:42:58

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

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

dos时代菜鸟 发表于 2021-5-11 21:07:49

本帖最后由 dos时代菜鸟 于 2021-5-11 21:09 编辑

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

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

dos时代菜鸟 发表于 2021-5-12 08:18:54

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

一个分区出来了,多个分区就简单了。
页: [1] 2 3 4
查看完整版本: 用 pecmd 创建、挂载、卸载 vhd 的脚本(不依赖diskpart)