无忧启动论坛

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

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

    [复制链接]
31#
 楼主| 发表于 2019-4-7 20:07:31 | 显示全部楼层
caocaofff 发表于 2019-4-7 19:12
建议将diskpart-Shell_Ver.1.15w.7z 稍加修改:

第35行:_Sub win0 ,W320 H100,DiskPart GUI Initializi ...

那 是个啥图标?我看看先。

刚加了个功能,可以把所选卷所在硬盘中所有未挂盘符的卷挂上盘符。
回复

使用道具 举报

32#
 楼主| 发表于 2019-4-7 22:02:04 | 显示全部楼层
利用好  "空脚本X" 和 复制粘贴功能,可以把多个操作 集中到一个脚本中 一次运行,减少diskpart 的调用次数。

可以先选择操作等进入脚本调取界面时,复制代码, 但不执行,只是把 脚本复制了,复制粘贴 攒到一起,一起执行。
回复

使用道具 举报

33#
 楼主| 发表于 2019-4-8 16:33:19 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-4-8 17:00 编辑

可能是 pecmd 的问题,怎么连表都没出来呢,怀疑你的环境pecmd 不能生成 tabl 表,你系统里面是不是有 pecmd ?试着换成压缩包里的

因为 没有判断出 系统启动模式 是 bios 还是 efi ,估计是你系统里面用了比较古老的 pecmd .

回复

使用道具 举报

34#
 楼主| 发表于 2019-4-8 22:39:25 | 显示全部楼层
应用鼠标捕获勉强解决 pecmd的 tabl表鼠标回归后自动乱选的问题。
改进 Load_script 段 脚本运行结果 编辑框 显示为"末端"
优化部分代码,解决 有些窗口没有及时关闭导致 pecmd 进程滞留系统的问题。

话说 pecmd 的这个 tabl 鼠标游走回归后就会乱选的毛病还真是。。。。。。
唉,内部bug 总是比 文本脚本运行快,所以脚本才有机会再慢慢选回来。呵呵

0x40+12 =76 这个用 pecmd calc 算出来的十进制得数 还是管用的,用在 edit 类别上了。
回复

使用道具 举报

35#
 楼主| 发表于 2019-4-9 16:05:30 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-4-9 16:06 编辑

windows 好像有病
整个磁盘分区序列中都是这样,
系统所在分区,叫 “boot” 中文叫 “启动”
负责启动的分区,叫 "system" 中文叫 “系统”

这个在 mbr 时代也就无所谓,可现在是 efi 了,gpt 了,就容易蒙。估计前些日子微软出的要给啥 补丁 就把系统 给更新到  负责启动 (名字和类型都叫做 system ) 的分区去了可能跟这个也有关系。

要想获取这样的数据,就要给他们另赋予个 内涵 比如 叫做  Loader  和 Operation 吧。呵呵
回复

使用道具 举报

36#
 楼主| 发表于 2019-4-9 23:01:32 | 显示全部楼层
1.16c 增加 分区 、卷 隐藏属性查看列, # 表示分区级别隐藏 ,* 表示 卷级别的隐藏
获取硬盘分区 是否担任了启动引导任务 和是否存有当前操作系统。 ~ 表示担任引导任务的硬盘和分区,* 表示存储着当前操作系统。









回复

使用道具 举报

37#
 楼主| 发表于 2019-4-10 09:10:49 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-4-10 09:11 编辑

在需要通过 分析卷来确定分区信息的 分区、卷 的 info 方面改进了 parts.cmd  ,虽然用的很少,但也需要考虑。1.16d

刚刚发现 只有 win10 2019ltsc 中的 diskpart 能够将 id=ef 的分区识别为卷,但是他却不能通过 select part /detail part / detail vol 的方式看到这个分区的卷信息,需要 select vol /detail part /detail vol 才能看到这个卷的信息并明确这个卷就是这个分区。

而之前的 diskpart 连把 这样的分区识别为 卷的能力都没有,这个很重要,至少可以挂载盘符 格式化和存储数据到这个分区。

点评

偶看见bug10这种东西就觉的恶心~  详情 回复 发表于 2019-4-10 10:10
回复

使用道具 举报

38#
 楼主| 发表于 2019-4-10 11:28:52 | 显示全部楼层
nttwqz 发表于 2019-4-10 10:10
偶看见bug10这种东西就觉的恶心~

没办法,百足之虫死而不僵。win系统现在就是 微软的  尾大不掉。

点评

我不是讨厌WIN,仅仅是讨厌bug10,流氓过头了!  详情 回复 发表于 2019-4-10 13:56
回复

使用道具 举报

39#
 楼主| 发表于 2019-4-10 14:20:25 | 显示全部楼层
nttwqz 发表于 2019-4-10 13:56
我不是讨厌WIN,仅仅是讨厌bug10,流氓过头了!

微软的主攻方向 已经不再 电脑软件上了。现在的 win 就会是这样,一种常年维护修修补补的状态。而且为了商业利益还要 有些 让人反感的举动,这都是必然的。
回复

使用道具 举报

40#
 楼主| 发表于 2019-4-11 18:22:53 来自手机 | 显示全部楼层
直接用ini需要其他俩文件配合,parts.cmd是是负责运行diskpart获取分区信息的。你就运行那个外面的,diakpartshell.cmd就行了。

点评

这个知道,我意思是你没对空格目录做兼容,你测试一下吧  详情 回复 发表于 2019-4-11 19:10
回复

使用道具 举报

41#
 楼主| 发表于 2019-4-11 20:27:56 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-4-11 20:32 编辑
caocaofff 发表于 2019-4-11 19:10
这个知道,我意思是你没对空格目录做兼容,你测试一下吧

测试了 ,把 diskpart_shell.cmd 和 script 文件夹一并放入 任何带空格的文件夹下 运行 diskpart_shell.cmd 没有问题。

要想改变 script 请在 diskpart2x.wcs 第32行添加一对 引号 内容,如下:红色部分
-----------------------------
  exec* &list_file=!cmd /c "chcp %cp% & "%curdir%\parts.cmd""
----------------------------------------------------------------------------

点评

你把script改成script script,cmd里也是  详情 回复 发表于 2019-4-11 20:29
回复

使用道具 举报

42#
 楼主| 发表于 2019-4-11 20:35:07 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-4-11 20:43 编辑
caocaofff 发表于 2019-4-11 20:29
你把script改成script script,cmd里也是


diskpart_shell.cmd 固定调用 与其同目录下的 script\diskpart2x.wcs 脚本,你这样改 script ,diskpart_shell.cmd 肯定因为找不到 脚本而失败,这样你需要 修改 diskpart_shell.cmd ,把 调用指令加 引号。

好吧,我修正了一下,直接把 wcs 脚本 拖拽给 pecmd 运行也可以,不论放什么地方,只要 保证脚本放在一起就行。
回复

使用道具 举报

43#
 楼主| 发表于 2019-4-12 07:59:44 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-4-12 08:14 编辑


改好的 已经放 1 楼。其实你可以自己改下,就那么俩 引号的事情。

你把 scrpt 路径改了,diskpart_shell.cmd 里面也得改,而且要是带空格,就要加 引号。为啥要 改路径名呢?双击运行 cmd 不就行了么?

点评

现在测试没有问题了,其实之前版本也没问题,这个BUG可能是f版本引入的  详情 回复 发表于 2019-4-12 09:09
回复

使用道具 举报

44#
 楼主| 发表于 2019-4-12 10:40:42 | 显示全部楼层
caocaofff 发表于 2019-4-12 09:09
现在测试没有问题了

确实是,我为了测试 语言代码,加入了 chcp 指令 给  cmd ,批处理调用路径上就 没再加个引号。因为有 外面那个 diskpart_shell.cmd 调用,应该没问题,就没改。没想到 你老弟 还有这 想法呀。呵呵
回复

使用道具 举报

45#
 楼主| 发表于 2019-6-1 11:47:04 | 显示全部楼层
发现一处错误,mbr 分区下 主分区激活按钮居然 不可用,现在已经改过来了,
是 因为 某次升级修改了表格结构,原本记录分区主、逻辑类型的字段后移,导致采集数据对不上。

点评

又更新了~  详情 回复 发表于 2019-6-1 16:03
回复

使用道具 举报

46#
 楼主| 发表于 2019-7-23 11:26:44 | 显示全部楼层
最新测试 1.20.2

改进了 硬盘分区序列 获取 的方法,用 pecmd 使 diskaprt 驻留进程,随时传递给其命令,然后获取其命令结果。
减少 diskpart 频繁调取 成本。
回复

使用道具 举报

47#
 楼主| 发表于 2019-7-23 20:28:15 | 显示全部楼层
2019.07.23

1.20.4
改进启动和数据刷新 模块,启动和刷新数据时 显示 调取的数据。
因为临时数据文件 不断增加,数据刷新的过程 可能会越来越慢,所以增加一个 “刷新diskpart” 的按钮,用于重新驻留 diskpart 进程,以减小临时文件大小。

1.20.3
用 pecmd 脚本取代 parts.cmd ,实现一次运行 diskpart 驻留进程并等待命令运行,进而节省 diskpart 的调用成本。
因为采用 pecmd+diskpart 获取硬盘分区序列,对一些字符定位进行了调整。
改进 硬盘均分 模块中 己算硬盘 大小的算法。
不再需要建立中间脚本,所有命令都传递给真实的diskpart 进程直接运行,所以 用变量取代了 创建dp_script 脚本文件,运行速度更快。
回复

使用道具 举报

48#
 楼主| 发表于 2019-7-23 21:21:17 | 显示全部楼层
2019hhh 发表于 2019-7-23 21:14
下载收藏谢谢!
请教,若硬盘分c.d.e.f.4个区,系统在c盘,选中d盘,删除,然后退出工具,硬盘c(系统).e.f.是否不 ...

应该不会受影响,不过,你为什么要这么做呢?
d盘删掉了,硬盘就有一块空间没有分配分区,就相当于空闲着浪费了。为啥不把它格式化呢?
回复

使用道具 举报

49#
 楼主| 发表于 2019-7-23 21:32:41 | 显示全部楼层
2019hhh 发表于 2019-7-23 21:26
不会这样做,就是疑问一下.工具很好用,能否放单文件版?

源码 不打包,方便随时改进。
要单文件的,可以自己做。
回复

使用道具 举报

50#
 楼主| 发表于 2019-7-24 06:01:27 | 显示全部楼层
因为为了保险起见 脚本设计成 每 50ms 轮询一次临时文件来判断上一条指令是否运行完毕,来决定运行下一条指令,所以会慢一些,可以在 diskpart2x.wcs 的 第 32行 envi wait_n=50 改为 envi wait_n=5 ,应该会快一些。

启动时 显示的 数据 是每 200ms 读取 临时文件信息,根 diskpart 运行是并行的,应该不会影响指令运行速度。

速度 还与 硬盘临时文件的大小、存储、硬盘个数、分区个数等有一定关系,尤其是 硬盘个数和分区个数,这个直接决定了 探测指令的个数。
而 pecmd 读取临时文件时,因为文件体积的增加,也会变慢。
回复

使用道具 举报

51#
 楼主| 发表于 2019-7-24 07:51:55 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-24 07:58 编辑

刚 增加了一个显示 数据载入时间的 文本签

这个不同于 diskpart /s 的方式运行脚本,因为 需要对临时文件进行轮询 确定 diskpart 及其每一条指令 已经运行了,这个是需要耗费时间的,但是对diskpart 本身的资源应该是 节省了的。而且以后 脚本中 要运行一些 指令,如果不重新 刷新数据,这些指令的运行也应该是 节省成本的,

如图:
如此硬盘分区结构的获取也不过10秒,多次运行 消耗时间出入不大。
回复

使用道具 举报

52#
 楼主| 发表于 2019-7-24 13:01:09 | 显示全部楼层
再次更新 1.20.8
调整 获取硬盘分区序列的算法,减少diskpart指令个数,加快获取速度。
优化时间算法。
增加 退出 按钮,防止 形成 pecmd 死进程。
回复

使用道具 举报

53#
 楼主| 发表于 2019-7-24 13:26:42 | 显示全部楼层

这回 加载 速度 也快了不少。
回复

使用道具 举报

54#
 楼主| 发表于 2019-7-24 16:10:32 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-24 16:29 编辑
datbik189 发表于 2019-7-24 15:59
牛,10秒太夸张了. 我运行你的脚本是1.5秒, 这才是让人愉悦的速度.

建议时间标签换成两种, 一种是diskp ...


现在的问题是临时文件越大,返回时间就越长。
而这个确实必须要承受的,因为我们要 读取临时文件 判断 指令是否运行完毕 并获取 指令运行结果。

而 向 diskpart 窗口传递指令 需要用 code 进行转化,这个也是费时的一个地方。

如果 pecmd 能够 让 diskpart 的输出 指向一个内存 位置 就好了。或者说 把临时文件放入内存。

刚发现一个脚本问题,就是 刷新 diskpart 进程 时,主窗口 是可操作的,此时如果用户 操作窗口,就可能发生问题,虽然 刷新 diskpart 进程只有一秒。有的 奇葩电脑 diskpart 启动就会很慢,有的甚至 几十秒,这样 就给用户机会去操作 主窗口了。所以 还是 改进了一下。

还有 发现 造成 pecmd 死进程的一个原因,可能是 我 再没有退出 pecmd 的情况下 修改编辑了正在调用的脚本。

点评

我运行了100遍 sel disk 0 + detail disk, 花了 135 ms. 防止误操作,只能是你在脚本中临时禁用某些控件. envi^ envimode=1 load #998 //启动diskpart date &t1 uptime load #999*命令_数字循环 &V 1 1 1  详情 回复 发表于 2019-7-24 16:29
回复

使用道具 举报

55#
 楼主| 发表于 2019-7-24 17:03:08 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2019-7-24 17:06 编辑
datbik189 发表于 2019-7-24 16:29
我运行了100遍 sel disk 0 + detail disk, 花了 15303 ms.

防止误操作,只能是你在脚本中临时禁用 ...


可能跟 envi^ envimode=0 有一定关系
我脚本中大量运行 %% 套 %% 的方式调用变量,不知道 envi^ envimode=1 模式下 怎么用 ~ 解释 多个% 嵌套解释的问题。

窗口控件已经 不能再减啥了,其他窗口的控件 都有功能跟着呢。

你把
result.txt 先存一些内容进去,比如一千行数据,然后把
diskpart >result.txt,变成 diskpart >>result.txt,再看看 ,肯定要更耗时,
这个 pecmd 读取文件时间 取决于 文件的大小。要是只是简单的 模拟 diskpart 的界面操作,并没有什么感觉。但是如果 用在我的这个 功能脚本 上,需要 在每次 Diskpart 指令结束 重新分析获取整个硬盘分区序列并取数据。就会越来越费时间。

关键就是 pecmd 读取文件 和判断 指令运行情况 这方面 费时间。某种程度上,还不如用 cmd 获取硬盘数据来的快了。

我这电脑配置也低,本身速度就上不来。

点评

ENVI^ ENVIMODE=0 是 PECMD4.0模式, 贪婪模式, 不能在%里面套用%. 这个应该不影响速度的. 临时禁止窗口: ENVI @WIN1.VISIBLE=0 //窗口不可见 ENVI @WIN1.ENABLE=0 //窗口不可用 运行了 3 次 50 遍 sel d  详情 回复 发表于 2019-7-24 17:32
回复

使用道具 举报

56#
 楼主| 发表于 2019-7-24 17:48:05 | 显示全部楼层
datbik189 发表于 2019-7-24 17:32
ENVI^ ENVIMODE=0 是 PECMD4.0模式, 贪婪模式, 不能在%里面套用%.
这个应该不影响速度的.

嗯 这个耗时 的 临时文件模式,根电脑本身速度也有关系,我要是这个情况 估计嘚半分钟。

那个 %% 套 %% 的我的那个脚本就在  用有啊。

点评

我的电脑也很烂, I3-8100 3.6 GHz ,内存 4G, 集显.  详情 回复 发表于 2019-7-24 17:59
回复

使用道具 举报

57#
 楼主| 发表于 2019-7-24 18:10:57 | 显示全部楼层
datbik189 发表于 2019-7-24 17:59
我的电脑也很烂, I3-8100 3.6 GHz ,内存 4G, 集显.


所以 在我这个脚本里面 干脆就是用户 每运行一组 diskpart 后需要刷新 硬盘分区数据的时候,就 重新来一个 diskpart 进程。这样,还要先把原来的diskpart关了,这个关闭的过程也耗时间。 来来回回的,唯一节省点儿的就是 运行 一组组的 diskpart 指令的时候 是在已有的 diskpart 进程中运行的,要不是考虑 这样可以减少 diskpart 的调用次数,我都不想用这个 办法了。

还有就是 那些 本来启动 diskpart 就很慢的情况下,一次启动了 diskpart 就尽量保持着这个 diskpart 的进程干更多的事情,这样才划算,所以才考虑 这么个办法,让 diskpart 驻留到 进程中由 pecmd 来控制的。

点评

有个思路,不知行不行,明天有空时弄弄再测下。 开始直接运行2个DISKPART,一个用着,一个备用。当其中一个重起,一个还能用。  详情 回复 发表于 2019-7-24 19:09
回复

使用道具 举报

58#
 楼主| 发表于 2019-7-24 20:47:08 | 显示全部楼层
datbik189 发表于 2019-7-24 19:09
有个思路,不知行不行,明天有空时弄弄再测下。

开始直接运行2个DISKPART,一个用着,一个备用。当 ...

可以考虑试试看。

点评

测试了一下,脚本运行速度没什么变化, 没办法了. 时间都是约 14 秒. [attachimg]397604[/attachimg] [attachimg]397605[/attachimg]  详情 回复 发表于 2019-7-25 15:03
从上面的图片,发现一个奇怪的问题,运行同样的命令sel disk 0 + detail disk,150遍后时间没有显注增加,我怀疑我的脚本计算总时那出问题了,而不是因为临时文件太长了导致时长的增加。 运行了1遍:19+22=41ms  详情 回复 发表于 2019-7-24 21:36
我那有现成的命令块,明早如果没事,我改下命令块。 我觉得应该可以自动切换,新的diskpart 重启好了,自动切换到新的diskpart,并重启另一个,如此循环,用线程。  详情 回复 发表于 2019-7-24 21:00
回复

使用道具 举报

59#
 楼主| 发表于 2019-7-24 21:28:20 | 显示全部楼层
随机发生  pecmd 僵尸进程。不知为何。
回复

使用道具 举报

60#
 楼主| 发表于 2019-7-25 15:04:31 | 显示全部楼层
小改动
1.21.4
优化 获取硬盘序列的 部分代码,减少指令条数。
纠正一处因为 使用 evnimode=1 导致的 %% 问题
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-8 02:54

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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