用 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-30 09:44 编辑
尚需完善,
没有判断 vhd 是否已经被挂载,(已经更新 实现)
没能将 vhd 中所有 可识别分区挂上盘符(已经实现,Ver1.10)
不支持 定义多个分区(这个功能恐怕 会复杂一些)
可以加强但还没实现的地方:
可以设置接受参数,根据参数判断是 vhd 文件还是 某个分区,如果是 Vhd 文件,就挂载之,如果是某个分区而该分区恰恰是 vhd 挂载上的,就卸载Vhd。
(已经实现并可集成到右键菜单 ver:1.07)
希望能够增加的功能:
支持创建 差分vhd ,但是 pecmd 好像还没有这个能力。
差分估计要研究数据结构,自己用PECMD造数据了https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif caocaofff 发表于 2021-4-29 12:03
差分估计要研究数据结构,自己用PECMD造数据了
如果用 api 能不能实现呢 刚更新了一下,可以搜集当前已经挂载的 vhd 的信息。有助于实现初步的判断。 本帖最后由 dos时代菜鸟 于 2021-4-29 13:32 编辑
这个东西 主要针对 包含一个分区的 vhd 设计。
就是 为做 vhd 系统玩儿的。
pecmd 可以 对没有 扩展名的 vhd 进行挂载。
更新下,可以支持附带参数。如果能将此集成到右键中,就更方便了。
1.05
增加算法,
增加可接收参数,
如果传递过来的参数是目录,就判断目所所在分区是否为VHDx挂载分区,如果是,就卸载VHDx
如果传递过来的是文件,就判断文件是否被挂载,如果是,就卸载之,如果没挂载,就挂载之。
把 一个 vhdx 拖放到 One_vhd.cmd 上,或者 把一个 分区或目录 拖放到 One_vhd.cmd 上就可以看到效果。
能罗列出当前都有哪些VHD被挂载了,第一分区挂载到那个盘符了。
这样可以方便卸载。 本帖最后由 dos时代菜鸟 于 2021-4-29 22:02 编辑
更新 1.07 增加一个 可以集成到右键菜单 的 批处理
右键 vhd(x) 文件 或者 分区,就会在右键菜单 有功能项目对应。
谢谢分享 dos时代菜鸟 发表于 2021-4-29 13:26
如果用 api 能不能实现呢
有相关API文档吗 红毛樱木 发表于 2021-4-29 22:20
有相关API文档吗
没有
我现在等同于 C语言盲
估计要找 微软技术网站了。 红毛樱木 发表于 2021-4-29 22:20
有相关API文档吗
大概就是这个吧,天书一样。
VirtDisk.dll
https://docs.microsoft.com/en-us/windows/win32/api/virtdisk/nf-virtdisk-createvirtualdisk dos时代菜鸟 发表于 2021-4-29 22:29
没有
我现在等同于 C语言盲
估计要找 微软技术网站了。
有API,用PECMD一样可以写的 本帖最后由 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,但是在 系统安装方面,用处就大了,可以变相实现一键还原。 dos时代菜鸟 发表于 2021-4-29 23:07
大概就是这个吧,天书一样。
VirtDisk.dll
随便翻了一下没找到差分的关键词,你找一下吧,找到给M,这个他把功能内置到PECMD里应该很简单,就是找资料麻烦。 红毛樱木 发表于 2021-4-29 23:20
随便翻了一下没找到差分的关键词,你找一下吧,找到给M,这个他把功能内置到PECMD里应该很简单,就是找资 ...
好吧,我找找看,
关键是我也不太明白呀。估计也是不好找 本帖最后由 dos时代菜鸟 于 2021-4-30 11:04 编辑
又 更新了一下 可以 在 挂载 vhd 的同时 将其中的 可识别而又没有盘符的分区 全部分配盘符。
Ver 1.10
配合右键适用,非常方便。
dos时代菜鸟 发表于 2021-4-29 11:25
尚需完善,
没有判断 vhd 是否已经被挂载,(已经更新 实现)
没能将 vhd 中所有 可识别分区挂上盘符(已 ...
学习了 根据当前系统位数直接把 对应的指令 " 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 红毛樱木 发表于 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 应该是可以实现的。 非常感谢!膜拜! 本帖最后由 dos时代菜鸟 于 2021-5-10 20:52 编辑
pecmd 对硬盘初始化的指令 如果没有指定 硬盘号,就默认处理第一个硬盘、
所以 ,如果 虚拟盘创建时 失败,没有进行判断,脚本会在 没有指定 盘号的情况下对 当前第一硬盘进行初始化,会导致 硬盘分区丢失。
造成创建虚拟盘失败 的原因主要是文件名错误、大小输入不对 等等。
为了避免这个问题,我小更新了一下。放在了一楼。1.12.1 比较了一下没有,是diskpart快些还是这个快些? 本帖最后由 dos时代菜鸟 于 2021-5-10 20:50 编辑
hhh333 发表于 2021-5-10 20:22
比较了一下没有,是diskpart快些还是这个快些?
这个快,快很多。
对于 含有 pecmd 的系统,只需要一个脚本 就可以实现。
pecmd 直接调用 dll ,要比 diskpart 装入节省时间,有的 vds 服务没有开启,diskpart 启动就会慢很多。
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:17 编辑
hhh333 发表于 2021-5-11 18:15
那就好,你那代码看起来费劲,如果只是建立一个Y盘如原来用diskpart是这样的
ENVI load_vhd=(echo creat ...
这个创建的 是扩展类型的,要创建 fixed 需要 该一下。cmd1 的内容 带 -d 参数,就是动态的。
dos时代菜鸟 发表于 2021-5-11 20:12
这个创建的 是扩展类型的,要创建 fixed 需要 该一下。cmd1 的内容 带 -d 参数,就是动态的。
这么复杂,太麻烦了。对part命令不熟,创建的VHD全部空间只建一个主分区,要这么复杂吗?
还有就是64k干吗用的?必须要吗?如果格成FAT格式呢? 本帖最后由 dos时代菜鸟 于 2021-5-11 21:09 编辑
hhh333 发表于 2021-5-11 20:42
这么复杂,太麻烦了。对part命令不熟,创建的VHD全部空间只建一个主分区,要这么复杂吗?
还有就是64k干 ...
64K 是分区的起始位置。
创建分区稍显麻烦。
主要还是挂载跟卸载功能。 hhh333 发表于 2021-5-11 20:42
这么复杂,太麻烦了。对part命令不熟,创建的VHD全部空间只建一个主分区,要这么复杂吗?
还有就是64k干 ...
一个分区出来了,多个分区就简单了。