无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: dos时代菜鸟
打印 上一主题 下一主题

diskpart shell ,用 pecmd 给 diskpart 做个外壳 2022.03.23 ver:1.28 改进

    [复制链接]
61#
 楼主| 发表于 2019-7-25 23:02:23 | 显示全部楼层
datbik189 发表于 2019-7-25 15:03
从测试来看, 建议采取切换WID的办法且不保存历史记录(将 &DISKPART_OLD 改成 &), 获得DISKPART的回显 ...

结合我自己的实际情况 按照双 diskpart 进程的想法,也弄了一个。你那个 代码有的地方不适合我这里用。

1.22.0
使用 双 diskpart 进程模式,
一个进程用完一次就 thrd方式 重启并换成另一个,如此往复,保证 sub:get_parts 使用的 diskpart 的临时文件是最小的。以此提高效率。
设置diskpart 进程重启的 行数阈值(160行),如果 当前 diskpart 进程对应的临时文件行数超过160 就另开启线程 重启之。
回复

使用道具 举报

62#
 楼主| 发表于 2019-7-26 10:52:41 | 显示全部楼层
1.22.1
改进 指令组 运行中 中断 功能,用户可以 在指令运行时间长不想再运行时,选择中断。
回复

使用道具 举报

63#
 楼主| 发表于 2019-7-26 20:02:50 | 显示全部楼层
调试,各种问题。
1.22.3 算是基本稳定了吧。
也没感觉快多少,就是 二次获取 硬盘分区序列 时要快一点点。可能是我的电脑太旧了。

用 pecmd 调取 diskpart 获取硬盘分区序列,对 硬盘以及分区进行 一些操作,
用到了 向 diskpart 常驻进程 发送指令 并 获取结果的思路,同时 采用双 diskpart 进程来交替 接收操作,来减缓因 输出文件过大而 延时变慢的问题。

这些权当是个 思路吧。
回复

使用道具 举报

64#
 楼主| 发表于 2019-7-27 08:51:26 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-27 08:52 编辑
datbik189 发表于 2019-7-26 21:20
那就没办法了。

线程只对有余力的电脑有效果,多出来的余力干更多的事。


如果读取文件大小 ,应该 比读取文件行数更节省时间。
读取文件最后一行,跟读取 少量十几行 用时应该差不多。
回复

使用道具 举报

65#
 楼主| 发表于 2019-7-27 11:00:47 来自手机 | 显示全部楼层
datbik189 发表于 2019-7-26 21:20
那就没办法了。

线程只对有余力的电脑有效果,多出来的余力干更多的事。

diskpart 的命令是要有个连续性的,
盲目换进程肯定不行,
比如,在一个进程 SELECT DISK 0 了,在另一个进程 DETAIL DISK  就会显示让你选个盘,因为第二进程不知道你选了哪个硬盘。
回复

使用道具 举报

66#
 楼主| 发表于 2019-7-27 23:11:39 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-27 23:20 编辑

pecmd 调取并行 窗口 通常会用
  1. call @-win0
复制代码

但有时窗口中的控件会显示不出来,所以我用
  1. thrd call @win0
复制代码

然后再用这个关闭窗口
  1. kill \%win0%
复制代码


但是 thrd 方式开启并行窗口 会有延时,如果 kill 指令在这个延时内运行,就是说 窗口还没有打开就运行 关闭指令,那么窗口将一直没有被关闭。
所以,在 thrd call @win0 以后要先进行一个 循环判断,判断指定标题的窗口确实存在了以后再运行下面的指令。

  1.   loop #1=1,  //循环判断 窗口已经开启
  2.   {
  3.       find --forpid:%&__PID% --wid*@ &win_info,窗口标题
  4.       find $%&win_info%!=,exit loop
  5.   }
复制代码

这问题一直没有发现,导致左改改,右改改的,还以为什么地方的循环没有设置好,导致窗口一直没有被关闭。
再次更新下,1.22.6


以前只会用 find 当 if 用,这下会用他判断窗口了。哈哈哈,也算有点儿长进。

回复

使用道具 举报

67#
 楼主| 发表于 2019-7-27 23:33:40 | 显示全部楼层
datbik189 发表于 2019-7-27 23:24
新文本比较旧文本获取更新部份还有一种方法,用size命令获取旧文本的大小值,再用GETE#获取更新部份的文本 ...

可以试试看。
其实慢就慢在读取临时文件上了。
那么 getf 怎么用呢? 文件的查询位置又如何计算呢,还要计算最后一行是否为特定内容来判断 diskpart 指令是否运行完了。

回复

使用道具 举报

68#
 楼主| 发表于 2019-7-28 11:17:18 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-28 11:47 编辑
datbik189 发表于 2019-7-27 23:50
换工作了手里没电脑,不然可以通过代码演示一下。

人为的在代码后加2回车,如set. v=list disk\n\n, ...


好的,
初步测试了一下,你这个方法,可以用秒算结果来形容了。

新版本已经更新到1楼
回复

使用道具 举报

69#
 楼主| 发表于 2019-7-29 08:07:14 | 显示全部楼层
回复

使用道具 举报

70#
 楼主| 发表于 2019-7-30 08:31:41 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-30 10:31 编辑
nttwqz 发表于 2019-7-29 23:30
可喜可贺,速度终于大幅超越了我写的批处理!

但是发现一些错误,就是那种list part就默认选中分区,无 ...





看来没有获得到 卷信息。
看看这个行不行 diskpart Shell 1.23.2.7z (1.63 MB, 下载次数: 4)

select disk 1
detail disk

如果能的话
select vol 3
detail  part

帮忙看下结果呗
十分怀疑 选择这个卷以后 ,detail part 的时候,分区焦点没有定位到这个卷,也就 行首没有 *
从图片看,应该 是 只获取到 list part 中 分区的部分信息,脚本应该是 识别处这个卷是一个分区,但是却没有通过 detail part 获取到这个卷的具体信息。



看看能获取卷的信息么,

还有
list vol  
回复

使用道具 举报

71#
 楼主| 发表于 2019-7-30 14:27:19 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-30 14:59 编辑

获取硬盘分区序列的算法:
1、list disk获取硬盘列表 计算硬盘个数/dyn/sta/size/free
2、逐个选取硬盘 sele disk x
        3、detail disk 获取硬盘信息和所包含的各个卷
               硬盘的 name/prot/gpt/rw/info
         4、获得卷的信息
               卷的 卷号/盘符/卷标/FS/STA/info
         5、逐个选择卷 sele vol x
         6、detail part 获得卷及对应分区编号和部分分区信息
                卷对应的 分区号/act/id
          7、detail vol 获取卷的一些信息
                 卷对应的 rw/hid/free
     8、list part 获取该硬盘对应的分区列表 获取各个分区的一部分信息
          分区对应的 硬盘/分区号/type/size/offset
     9、逐个判断分区是否有对应的卷,如果有,就用(4/5/6步)已提取过的卷数据冲入该分区对应的变量组中,如果没有
          10、选择这个分区 sele part x
          11、detail part  获取分区对应的另一部分信息,因为其没有对应的卷也就不需要提取计算其对应的卷信息。
12、list vdisk  获取虚拟硬盘列表,将虚拟硬盘的部分信息修改进对应硬盘的信息中,name/port等


这个算法
1、绕开了,对于 mbr 模式下 的 id=ef 的分区,在 win10-2019-ltsc 下 不能通过 select part /detail part 的方式 获取卷信息的情况,用 select vol /detail part 却可以获取 卷信息。
2、同时对于第10步 ,某些 part 会被自动选择 自动定位焦点 * ,导致 select part x 失效的情况,事实上,这样的盘都是卡盘,只有一个分区,detail part 仍然可以成功获取这个分区的信息,只需要在获取分析输出信息时将 "*" 这个字符 替换掉或者绕开读取就可以了。
3、针对楼上 的反馈,可能 sele vol /detail part 不能获取 卷焦点,导致无法获取卷行信息的情况,直接在 detail disk 阶段就获取 该硬盘个卷信息也就是了。
回复

使用道具 举报

72#
 楼主| 发表于 2019-7-30 23:31:39 来自手机 | 显示全部楼层
nttwqz 发表于 2019-7-30 22:04
没有什么变化。。。

多谢反馈。

明白了,果然如此,问题出在detail part 上了,原来是 select vol 后,不能通过detail part 获取分区信息。脚本判断这个卷没有对应的分区,没有采集这个卷的信息。
而 select part 以后,因为前面的判断这个分区没有对应的卷,如同扩展分区,也就没有采集这个分区的卷信息。
明天改进下。
回复

使用道具 举报

73#
 楼主| 发表于 2019-7-31 10:03:50 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-31 10:06 编辑
nttwqz 发表于 2019-7-30 22:04
没有什么变化。。。


调整了一下算法
diskpart Shell 1.23.3.7z (1.63 MB, 下载次数: 1) 还得请老弟帮忙测试下。

获取硬盘分区序列的算法:
1、list disk获取硬盘列表 计算硬盘个数/dyn/sta/size/free
2、逐个选取硬盘 sele disk x
        3、detail disk 获取硬盘信息和所包含的各个卷
               硬盘的 name/prot/gpt/rw/info
         4、逐个选择卷 sele vol x
         5、detail part 获得卷及对应分区编号和部分分区信息,如果无法获取改卷对应的分区,也将该卷信息存储备用。
                卷对应的 分区号/act/id/hid#
         6、获得卷的信息
               卷的 卷号/盘符/卷标/FS/STA/info
         7、detail vol 获取卷的一些信息
                 卷对应的 rw/hid*/free
     8、list part 获取该硬盘对应的分区列表 获取各个分区的一部分信息
          分区对应的 硬盘/分区号/type/size/offset
     9、逐个判断分区是否有对应的卷,如果有,就用(5/6/7步)已提取过的卷数据冲入该分区对应的变量组中,如果没有
          10、选择这个分区 sele part x
          11、detail part  获取分区对应的另一部分信息  分区号/act/id/hid#/卷号 (与第5步内容相同)
          12、如果获取到分区对应的卷,就将前面 (6/7步)获取的卷信息冲入分区变量组中
13、list vdisk  获取虚拟硬盘列表,将虚拟硬盘的部分信息修改进对应硬盘的信息中,name/port等

常常情况下 diskpart 内建的 vol+part 体系会互相关联,也就是 select vol 时,相关的part 也会获得焦点,而 select part 时 ,对应的 vol 也会获得焦点。
但是,
有的分区信息不能通过 select vol + detail part +detail vol方式获取(比如某些移动卡 part 被自动选择焦点),
而另有一些分区信息又不能通过select disk + select part + detail part 的方式获取(比如 win10-2019-ltsc中的 id=ef 的分区),这个算法照顾到这两种情况而设计。
算法设计绝不是将某个 特例 当作特例而添加 “如果。。。那么” 来解决,而是将两套算法融合,使用于将来可能更广泛的情况。
回复

使用道具 举报

74#
 楼主| 发表于 2019-7-31 21:07:39 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-31 21:54 编辑


彻底晕了。

----------------------
sele vol
detail part
detail vol
list part
-----------------------
sele part
detail part
detail vol
list vol

看下 结果么?
难道 sele part 后 detail part 也不能获取 分区信息?难道需要 sele part + list vol 来确定 分区与卷的对应关系?

如果问题只出现在 移动卡 上,也就无所谓,这样的卡,用 diskpart 从新分区就没这毛病了,如果不想对它进行分区,diskpart 识别不出它的信息也就无所谓了。diskpart 就是分区用的。

回复

使用道具 举报

75#
 楼主| 发表于 2019-7-31 22:15:57 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-31 22:20 编辑
nttwqz 发表于 2019-7-31 22:10
这就是我电脑的第二步的diskpart脚本


我想知道 如果他 自动选择了 part ,那么 detail disk 和 list vol 的时候,那个bug分区对应的卷是否也会被自动选择了呢?如果是的话,就可以 确定 part 与 vol 的对应关系了。

如果 detail part 无法运行,那么 id  隐藏 激活 之类的信息也就无法获取了。
回复

使用道具 举报

76#
 楼主| 发表于 2019-7-31 22:32:58 | 显示全部楼层
nttwqz 发表于 2019-7-31 22:24
你想多了,没有!

原来我也有这么个 卡,后来被我 diskpart 弄了一遍,就没这毛病了。
也不知道这毛病怎么弄出来的。 如果一个卡 里面有俩这样的分区,就麻烦了。

sele vol 以后,list part,看 * 焦点 ,应该能确定 那个卷对应的分区。因为 它不是 自动 * 的么?呵呵
那么,如果 sele part 然后 list vol 能看到  vol 的焦点落在对应的卷上么?

要是 不论  sele vol 还是 selel part ,都不能 detail part 来获取结果,那,我可以考虑,将分区信息与卷信息分两行显示在列表中,可以看出他们是找不到对方的分区 或者卷,
回复

使用道具 举报

77#
 楼主| 发表于 2019-7-31 23:27:10 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-31 23:35 编辑
nttwqz 发表于 2019-7-31 22:45
我在很久之前就考虑过多分区的情况,后来好像证实是我想多了,这样的情况只能有一个分区。

sel vol/li ...


这就好办了
diskpart Shell 1.23.4.7z (1.63 MB, 下载次数: 6)

正常是应该先考虑 list part + sele part + detail part +list vol+ detail vol  ,
但是有那个 id=ef 的情况,我就考虑 detail disk + sele vol +detail part +detail vol 再 list part +sele part +detail part ,就是先把 vol 的信息都跟分区对应着存好,list part 的时候,就只剩下没有 卷的分区信息需要搜集了,没有卷的分区对应的信息也少。结果现在出现 找不到对应分区的卷这种情况,也就是 预 * 了的分区,如果sele vol + list part 可以获取焦点分区 能够把卷跟分区对应上,也就没问题了。

获取硬盘分区序列的算法:
1、list disk获取硬盘列表 计算硬盘个数/dyn/sta/size/free
2、逐个选取硬盘 sele disk x
        3、detail disk 获取硬盘信息和所包含的各个卷
               硬盘的 name/prot/gpt/rw/info
         4、逐个选择卷 sele vol x
         5、detail part 获得卷及对应分区编号和部分分区信息,
                卷对应的 分区号/act/id/hid#
           如果无法获取改卷对应的分区,尝试通过
           5.1  list part 获取当前分区焦点的方式获取对应的分区号,但将无法获取 /act/id/hid#
           如果明确了卷 对应的 分区       
           6、获得卷的信息
               卷的 卷号/盘符/卷标/FS/STA/info
           7、detail vol 获取卷的一些信息
                 卷对应的 rw/hid*/free
     8、list part 获取该硬盘对应的分区列表 获取各个分区的一部分信息
          分区对应的 硬盘/分区号/type/size/offset
     9、结合第5步逐个判断分区是否有对应的卷,如果有,就用(5/6/7步)已提取过的卷数据冲入该分区对应的变量组中,如果没有
          10、选择这个分区 sele part x
          11、detail part  获取分区对应的另一部分信息  分区号/act/id/hid#/卷号
12、list vdisk  获取虚拟硬盘列表,将虚拟硬盘的部分信息修改进对应硬盘的信息中,name/port等
回复

使用道具 举报

78#
 楼主| 发表于 2019-8-4 21:15:59 | 显示全部楼层
nttwqz 发表于 2019-8-3 21:22
这个本版已经可以获取上次获取不到的信息,但是文件系统未获取,也不知道是不是你刻意为之以区分其它磁盘 ...

多谢帮忙测试反馈

果然,原来是我 把 只能通过 list part 获取卷对应分区的 FS 设置成了 . ,
这可真是,在程序面前,一点儿也不能差呀。哈哈

已经纠正了,放在了一楼
回复

使用道具 举报

79#
 楼主| 发表于 2019-8-8 11:07:43 | 显示全部楼层
我想,如果 已经基本解决 频繁调用 diskpart 的繁琐耗时的问题,可能可以进一步 做些什么。
比如,图形化的 分区显示,显示未使用部分,选择图形上未使用部分,可以直接创建分区等等。
等有了时间,再慢慢研究下。
回复

使用道具 举报

80#
 楼主| 发表于 2019-8-26 07:52:17 | 显示全部楼层
ver=1.23.6
发现一处纰漏,vhd 的 other_info 信息显示有问题,已经纠正。
改进 分区时 可以根据所选分区类型 自动选择 文件系统类型。
回复

使用道具 举报

81#
 楼主| 发表于 2020-5-7 18:49:14 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2020-5-7 18:56 编辑

更新了一下
有关 VHD 方面的。可以创建 子 vhd 了,
更新在1楼

设置创建一个 子vhd


创建 子vhd 的脚本内容和执行结果


子vhd 自动被挂载了。


回复

使用道具 举报

82#
 楼主| 发表于 2020-5-16 21:54:49 | 显示全部楼层


早有见过.只是加密压缩了.用着还可以,有些凌乱.diskpart 的执行 是基于 diskpart脚本 执行的.

我这个 是 基于 diskpart 命令行的,运行效率上应该 有所改进了.功能上嘛,还不想弄的太复杂.
回复

使用道具 举报

83#
 楼主| 发表于 2020-6-27 22:36:36 | 显示全部楼层
2010hook 发表于 2020-6-27 11:49
格式化卷、设置属性等对话框的标题,我添加了盘符,很简单,减少误操作:格式化 %chk_ltr%:
如果还能获取 ...

看  _Sub radi0  段 内容,就知道了
回复

使用道具 举报

84#
 楼主| 发表于 2020-6-27 22:51:00 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2020-6-27 23:02 编辑
2010hook 发表于 2020-6-27 22:39
chk_*、part_* 相关的变量,我逐个试了都没有。

需要你 引用 表格 第 12 个项目 自行设置一个 变量 用于你的目的。
radi0 段并没有 引用 第12个项目 设置变量,你可以自己设置一个呀。试试看吧。如下图 两个地方分别添加 那么两句话就是了。






从 下图 位置可以得知  卷标 项目 排行 第12



评分

参与人数 1无忧币 +5 收起 理由
2010hook + 5 有劳了,非常感谢!

查看全部评分

回复

使用道具 举报

85#
 楼主| 发表于 2020-6-27 22:56:26 | 显示全部楼层
红毛樱木 发表于 2020-6-27 22:44
什么卷标?突然冒出来这句话,不知道怎么理解。。。

他是想 格式化某个分区的时候 直接用被格式化分区 的卷标 lable ,不用再手动填写一遍。

其实就是 引用一下列表中 涉及卷标的那个 列 中的数据也就是了。
回复

使用道具 举报

86#
 楼主| 发表于 2020-6-29 08:14:48 | 显示全部楼层
2010hook 发表于 2020-6-28 08:40
硬盘均分 是比较落后的方案,浪费空间。
我觉得 一键创建启动硬盘U盘(ESP+若干常规分区,ESP可置后) 更实 ...

均分 只是提供个 脚本模型,
在执行前,不是提供了 指令吗?可以在那上面改。
这就是个 diskpart 的外壳,如果 一点儿 diskpart 命令都不明白,那 也就不存在啥 浪费不浪费的了,小白用这个,那就嘚用落后的方案呗。弄得复杂了,出问题的几率也大。 我这费尽心思 弄出的逻辑 闹不好,人家小白一个不注意就 出大错。不敢弄得太 深,太烧脑。

你要是 想改成这个方案的,可以自己到 代码里 修改,说明了是 修改版就行。这玩意儿既然开源,就没 版权,就是方便 技术人员 研究的。
回复

使用道具 举报

87#
 楼主| 发表于 2020-7-2 17:48:33 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2020-7-2 17:52 编辑
2010hook 发表于 2020-7-1 13:15
楼主似乎对“专业”存在误解,我分享王垠一篇文章:
http://www.yinwang.org/blog-cn/2013/03/07/linux-wi ...

指望 专业人员 做出 可以让小白也成为专业人员的 工具来?这条路永远也没有尽头。

我不是专业人员,我也只是个小白。

寄希望于别人成就你的懒,别人也想歇歇呢。
自己研究去

windows 是给懒人设计的系统,方便快捷,但也闭原收费。还有更懒的人连windows 怎么用也懒得去学呢。

有些事,太纠结,会生病的。


回复

使用道具 举报

88#
 楼主| 发表于 2020-7-15 06:56:08 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2020-7-15 08:42 编辑

小升级一下
1.23.8  
放在一楼

因为diskpart 获取的 分区大小 不准确,所以可能导致 未被分区的空间 计算出现偏差。

暂时 不支持 437 code 的 diskpart


增加 显示 硬盘未被分配分区的空间,并可以直接将其创建分区



回复

使用道具 举报

89#
 楼主| 发表于 2020-7-15 12:35:49 | 显示全部楼层
正考虑 用 pecmd 获取更准确的 分区起止位置,来准确定位 未分配的 空间。
回复

使用道具 举报

90#
 楼主| 发表于 2020-7-15 14:01:36 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2020-7-15 14:18 编辑

1.23.81 更新完毕,待测试

主要更新 :
用 pecmd 精确获取分区 偏移量 和大小,精准计算磁盘中 没有被分区的区域位置和大小。忽略 1M 以下空间。
实现 根据未分区空间创建 分区更直观方便。

这个更新主要难度 在 扩展分区的处理上,有的分区在扩展分区中,有的在扩展分区外,未分区空间也是有的在扩展分区中,有的在扩展分区外。
好在 diskpart 的 mbr 体系中 扩展分区只允许有一个。
因为 diskpart 先天问题,把分区的大小都 四舍五入的用 G M 来表示,所以还要考虑 用 pecmd 更精准的获取偏移量 和 大小,但是 又要把 pecmd 获取的数据 与 diskpart 对接上。

目前这个测试脚本 还是需要测试。

更新版本已经放到 1 楼。

回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-2 13:22

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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