无忧启动论坛

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

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

    [复制链接]
1#
发表于 2019-7-23 23:03:15 | 显示全部楼层
本帖最后由 datbik189 于 2019-7-23 23:11 编辑

感觉是初次启动diskpart时间久,我的WIN10机子经过测试,要300-2500ms,有时快,有时慢。

http://bbs.wuyou.net/forum.php?m ... 2NTl8MHwyMDU0MDI%3D

回复

使用道具 举报

2#
发表于 2019-7-24 15:59:20 | 显示全部楼层

牛,10秒太夸张了. 我运行你的脚本是1.5秒, 这才是让人愉悦的速度.

建议时间标签换成两种, 一种是diskpart的启动时间,一种是脚本运行的时间, 这样才能判断是diskpart慢, 还是分析脚本慢.

时常调用diskpart的脚本, 建议做成命令块, 这将大大减少工作量.

附件中的文件:

#997:
为测试版本, 需人工输入.

#998:
为命令行版本, 自动化,返回以下的变量值.
&DISKPART_WID   --- 返回窗口的WID值
&DISKPART-FILE   --- 返回临时文件的全路径名称
&RET_F                --- 返回运行的历史记录
&RET_L                --- 返回最新命令运行的记录

DISKPART_TEST.EXE

1.01 MB, 下载次数: 4, 下载积分: 无忧币 -2

点评

现在的问题是临时文件越大,返回时间就越长。 而这个确实必须要承受的,因为我们要 读取临时文件 判断 指令是否运行完毕 并获取 指令运行结果。 如果 pecmd 能够 让 diskpart 的输出 指向一个内存 位置 就好了。  详情 回复 发表于 2019-7-24 16:10
回复

使用道具 举报

3#
发表于 2019-7-24 16:29:53 | 显示全部楼层
本帖最后由 datbik189 于 2019-7-24 16:46 编辑
dos时代菜鸟 发表于 2019-7-24 16:10
现在的问题是临时文件越大,返回时间就越长。
而这个确实必须要承受的,因为我们要 读取临时文件 判断 ...



我运行了100遍 sel disk 0 + detail disk, 花了 15303 ms.

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

envi^ envimode=1
load #998  //启动diskpart
date &tt1 uptime   //开始计时
load #999*命令_数字循环 &V 1 1 100 //生成数字1~100
forx * %&V%,&V1,
{*
set. &V_=sel disk 0 \n detail disk
load #998 &V_
}
date &tt2 uptime
calc &tt=%&tt2%-%&tt1%   //结束计时
mess %&ret_f%\n%&ret_l%@耗时 %&tt% ms
kill diskpart

点评

可能跟 envi^ envimode=0 有一定关系 我脚本中大量运行 %% 套 %% 的方式调用变量,不知道 envi^ envimode=0 模式下 怎么用 ~ 解释 多个% 嵌套解释的问题。 窗口控件已经 不能再减啥了,其他窗口的控件 都有功能  详情 回复 发表于 2019-7-24 17:03
回复

使用道具 举报

4#
发表于 2019-7-24 17:32:58 | 显示全部楼层
本帖最后由 datbik189 于 2019-7-24 17:37 编辑
dos时代菜鸟 发表于 2019-7-24 17:03
可能跟 envi^ envimode=0 有一定关系
我脚本中大量运行 %% 套 %% 的方式调用变量,不知道 envi^ envim ...



ENVI^ ENVIMODE=0 是 PECMD4.0模式, 贪婪模式, 不能在%里面套用%.
这个应该不影响速度的.

ENVI^ ENVIMODE=1 是 标准模式, ^SET &V=%%%~1%%或者 ^^^SET &V=%%%~1%%
(一个^就解释一遍)

临时禁止窗口:
ENVI @WIN1.VISIBLE=0 //窗口不可见
ENVI @WIN1.ENABLE=0 //窗口不可用

运行了 3 次 50 遍 sel disk 0 + detail disk,是一遍比一遍慢.

办法是检测文本的行数,大于500行,重启DISKPART?



点评

嗯 这个耗时 的 临时文件模式,根电脑本身速度也有关系,我要是这个情况 估计嘚半分钟。 那个 %% 套 %% 的我的那个脚本就在 用有啊。  详情 回复 发表于 2019-7-24 17:48
回复

使用道具 举报

5#
发表于 2019-7-24 17:59:41 | 显示全部楼层
dos时代菜鸟 发表于 2019-7-24 17:48
嗯 这个耗时 的 临时文件模式,根电脑本身速度也有关系,我要是这个情况 估计嘚半分钟。

那个 %% 套 % ...


我的电脑也很烂, I3-8100 3.6 GHz ,内存 4G, 集显.

点评

所以 在我这个脚本里面 干脆就是用户 每运行一组 diskpart 后需要刷新 硬盘分区数据的时候,就 重新来一个 diskpart 进程。这样依赖,还要先把原来的关了,这个关闭的过程也耗时间。 来来回回的,唯一节省点儿的就是  详情 回复 发表于 2019-7-24 18:10
回复

使用道具 举报

6#
发表于 2019-7-24 19:09:05 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2019-7-24 18:10
所以 在我这个脚本里面 干脆就是用户 每运行一组 diskpart 后需要刷新 硬盘分区数据的时候,就 重新来 ...


有个思路,不知行不行,明天有空时弄弄再测下。

开始直接运行2个DISKPART,一个用着,一个备用。当其中一个重起,一个还能用。

点评

可以考虑试试看。  详情 回复 发表于 2019-7-24 20:47
回复

使用道具 举报

7#
发表于 2019-7-24 21:00:31 | 显示全部楼层


我那有现成的命令块,明早如果没事,我改下命令块。

我觉得应该可以自动切换,新的diskpart 重启好了,自动切换到新的diskpart,并重启另一个,如此循环,用线程。
回复

使用道具 举报

8#
发表于 2019-7-24 21:36:59 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2019-7-24 20:47
可以考虑试试看。


从上面的图片,发现一个奇怪的问题,运行同样的命令sel disk 0 + detail disk,150遍后时间没有显注增加,我怀疑我的脚本计算总时那出问题了,而不是因为临时文件太长了导致时长的增加。

运行了1遍:19+22=41ms
运行了50遍:12+26=38ms
运行了100遍:15+27=42ms
运行了150遍:18+36=54ms
回复

使用道具 举报

9#
发表于 2019-7-25 15:03:27 | 显示全部楼层
本帖最后由 datbik189 于 2019-7-25 17:01 编辑



从测试来看, 建议采取切换WID的办法且不保存历史记录(将 &DISKPART_OLD 改成 &), 获得DISKPART的回显.

测试了一下,脚本运行速度没什么变化, 没办法了.

固定WID 和 切换不同的WID (换DISKPART), 运行100遍 "sel disk 0 + detail disk" 时间都是约 14 秒.

运行了1500次以后, 不保存历史记录(将 &DISKPART_OLD 改成 &), 结果如下:

固定WID: 临时文件有 43508 行,最后一次运行的时间为 217 ms, 总的运行时间 227 秒.

变换WID:  临时文件小于 500 行,最后一次运行的时间为 33 ms, 总的运行时间为 109 秒.





变换WID脚本:

envi^ envimode=1

set-raw &启动副本=thread* -here -tid:&备用tid team wait 50|set &DISKPART_备用WID=|load #998 & &DISKPART_备用WID &DISKPART_备用FILE & &|SET-RET &DISKPART_备用WID=%&DISKPART_备用WID%|SET-RET &DISKPART_备用FILE=%&DISKPART_备用FILE%
team set. &exit=exit\n|load #999*命令_宽字符 &exit

load #998 & &DISKPART_WID &DISKPART_FILE &DISKPART_OLD &DISKPART_NEWS //启动diskpart
%&启动副本%

load #999*命令_数字循环 &num 1 1 100 //生成数字序列
date &t1 uptime
forx * %&num%,&,
{* set. &指令=sel disk 0 \n detail disk
   load #998 &指令 &DISKPART_WID &DISKPART_FILE &DISKPART_OLD &DISKPART_NEWS
   Team read %&DISKPART_file%,**,&V|read -*,-1,&V,&V
   IFEX $[%&V%>500 & %&DISKPART_备用WID%>0],
   {* forx * %&exit%,&V,ENVI @@SENDMSG=%&DISKPART_WID%;0X102;0x%&V%
      Team set &DISKPART_WID=%&DISKPART_备用WID%|set &DISKPART_FILE=%&DISKPART_备用FILE%
      %&启动副本%
    }
}
date &t2 uptime
calc &t=%&t2%-%&t1%
team set. &line=%&DISKPART_OLD%\n%&DISKPART_NEWS%|read -*,-1,&line,&line
mess %&DISKPART_OLD%\n%&DISKPART_NEWS%@耗时 %&t% ms %&line% 行
kill diskpart.exe



DISKPART.7z

985.1 KB, 下载次数: 8, 下载积分: 无忧币 -2

回复

使用道具 举报

10#
发表于 2019-7-25 23:32:46 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2019-7-25 23:02
结合我自己的实际情况 按照双 diskpart 进程的想法,也弄了一个。你那个 代码有的地方不适合我这里用。
...


问题解决了就好,原理都一样,剩下就是看测试反馈了。
回复

使用道具 举报

11#
发表于 2019-7-26 21:20:48 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2019-7-26 20:02
调试,各种问题。
1.22.3 算是基本稳定了吧。
也没感觉快多少,就是 二次获取 硬盘分区序列 时要快一点点 ...

那就没办法了。

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

我的电脑运行简单的Sel和Detail命令,连续运行1500次,平均耗时 35 ms -切换diskpart 和 70 ms - 单一diskpart。
回复

使用道具 举报

12#
发表于 2019-7-27 11:45:08 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2019-7-27 11:00
diskpart 的命令是要有个连续性的,
盲目换进程肯定不行,
比如,在一个进程 SELECT DISK 0 了,在另一 ...


无缝衔接,处理下就好了,可以用diskpart查询,也可以分析历史记录。
回复

使用道具 举报

13#
发表于 2019-7-27 11:46:34 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2019-7-27 08:51
如果读取文件大小 ,应该 比读取文件行数更节省时间。
读取文件最后一行,跟读取 少量十几行 用时应该 ...

写个简单脚本测试下就好。
回复

使用道具 举报

14#
发表于 2019-7-27 23:24:32 来自手机 | 显示全部楼层
本帖最后由 datbik189 于 2019-7-27 23:34 编辑

新文本比较旧文本获取更新部份还有一种方法,用size命令获取新旧文本的差值,再用GETE#获取更新部份的文本原样,最后用code命令转成uni,不知道这样会不会快些,也不用切换diskpart. 该方法没测试过,也许也行不通.
回复

使用道具 举报

15#
发表于 2019-7-27 23:50:21 | 显示全部楼层
dos时代菜鸟 发表于 2019-7-27 23:33
可以试试看。
其实慢就慢在读取临时文件上了。
那么 getf 怎么用呢? 文件的查询位置又如何计算呢,还 ...

换工作了手里没电脑,不然可以通过代码演示一下。

人为的在代码后加2回车,如set. v=list disk\n\n,判断最后二行作为代码运行完毕的标志。GETF# 123.txt,(旧文本大小+5)#*,&V,再用code **-ansi,&V,**-uni,&V
回复

使用道具 举报

16#
发表于 2019-8-13 22:25:07 | 显示全部楼层
本帖最后由 datbik189 于 2019-8-14 07:49 编辑
dos时代菜鸟 发表于 2019-7-28 11:17
好的,
初步测试了一下,你这个方法,可以用秒算结果来形容了。



解决了就好,附件是我的测试结果,看起来还可以。

用的电脑是T420i,7年前的电脑,奔腾处理器


DISKPART.rar

989.46 KB, 下载次数: 12, 下载积分: 无忧币 -2

回复

使用道具 举报

17#
发表于 2022-12-6 22:04:40 来自手机 | 显示全部楼层
本帖最后由 datbik189 于 2022-12-6 22:06 编辑
dos  2022-12-6 17:59
   debug У 漰  鸴   ...

支持中文命令传递的,这是以前讨论时弄的测试脚本。

DISKPART.7z

983.94 KB, 下载次数: 29, 下载积分: 无忧币 -2

回复

使用道具 举报

18#
发表于 2022-12-6 22:14:05 来自手机 | 显示全部楼层
527104427 发表于 2022-12-6 19:40
还有地方可能出现中文,比如格式化分区时的卷标。
所以,我放弃常驻内存的diskpart了。

支持中文命令传递。
回复

使用道具 举报

19#
发表于 2022-12-6 23:18:08 | 显示全部楼层
527104427 发表于 2022-12-6 22:38
这么强吗,#999是啥宝贝,能偷偷分享一下吗

传递中文命令需要将命令转化成宽字符。
set. &v=\n  //命令演示: 回车
getf &v,0#*,&v //得到窄字符: 0x0d 0x00 0x0a 00
sed -ex &v=0,{0x}{\h\h}{ 0x}{\h\h},0x\4\2,&v //得到宽字符: 0x000d 0x000a

评分

参与人数 1无忧币 +5 收起 理由
527104427 + 5 解决大问题

查看全部评分

回复

使用道具 举报

20#
发表于 2022-12-7 16:55:18 | 显示全部楼层
527104427 发表于 2022-12-7 16:00
还是有问题:

select disk 5%nl%detail disk%nl%san%nl%select vdisk file="D:\doc\desktop\动态磁    ...

cmd和diskpart一样,只支持单行命令, 多行命令得使用脚本文件.
回复

使用道具 举报

21#
发表于 2023-4-4 15:27:59 | 显示全部楼层
最近测试了下, 好像cmd.exe和diskpart.exe支持发送多行的指令的全家桶, 并成功运行. 测试成功的原因, 难道是我的指令太简单了???

回复

使用道具 举报

22#
发表于 2023-4-5 08:21:30 来自手机 | 显示全部楼层
dos时代菜鸟 发表于 2023-4-5 07:05
如果众多命令流中有一条是错误的,是否影响后继运行?

不影响。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-12 11:52

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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