无忧启动论坛

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

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

    [复制链接]
1#
发表于 2019-3-29 16:03:37 | 显示全部楼层
菜鸟大哥也发现pecmd的魅力啦,赞一个

点评

大概2008年 就 用着编脚本 ,显卡声卡网卡驱动的 pe 安装。  详情 回复 发表于 2019-3-29 16:32
回复

使用道具 举报

2#
发表于 2019-4-3 22:50:11 | 显示全部楼层
dos时代菜鸟 发表于 2019-4-3 21:26
刚发现 新思路的 parts.cmd 在获取分区 剩余空间 上 有点偏差,已经修正放一楼。 1.06

顺便说一下,PECMD处理文本的能力比CMD强,那两个批处理完全可以用PECMD代码来替代。

点评

pecmd 好像没有 split 这样的函数,怎么处理一条记录中有多个字段的情况? 还有 pecmd 自带说明 关于 rstr 还是 sstr 好像写错了。记不清了。  详情 回复 发表于 2019-4-3 22:54
回复

使用道具 举报

3#
发表于 2019-4-4 00:05:28 | 显示全部楼层
本帖最后由 527104427 于 2019-4-4 00:07 编辑
dos时代菜鸟 发表于 2019-4-3 22:54
pecmd 好像没有 split 这样的函数,怎么处理一条记录中有多个字段的情况?
还有 pecmd 自带说明 关于 r ...


举个例子吧:


  1. //捕获diskpart输出
  2. EXEC* -hide &&a=cmd.exe /c echo exit|%ComSpec%/kprompt list$Sdisk$_|diskpart
  3. //mess. %&&a%

  4. //查找第一个"--------"所在行数
  5. LPOS* * ,&&b=--------,1,&&a

  6. //查找最后一个"DISKPART>"所在行数
  7. RPOS* * ,&&c=DISKPART>,1,&&a

  8. //截取"--------"和"DISKPART>"中间的数据
  9. CALC #&&d=%&&b%+1
  10. CALC #&&e=%&&c%-%&&b%-2
  11. READ -*,%&&d%+%&&e%,&&f,&&a
  12. //mess. %&&f%

  13. //截取磁盘号、状态、总大小、可用大小
  14. ENVI &&z=1
  15. LOOP #%&&z%<=%&&e%,
  16. {*
  17.         READ -*,%&&z%,&&g,&&f
  18.         MSTR * &&h,&&i,&&j,&&k,&&l,&&m=<2*>&&g
  19.         mess. [磁盘:%&&h%]  [状态:%&&i%]  [总大小:%&&j%%&&k%]  [可用大小:%&&l%%&&m%]
  20.         CALC #&&z=%&&z%+1
  21. }
复制代码

点评

等研究研究,单独弄个 wcs  详情 回复 发表于 2019-4-4 14:34
回复

使用道具 举报

4#
发表于 2019-4-4 20:22:44 | 显示全部楼层
dos时代菜鸟 发表于 2019-4-4 19:51
弄些颜色,这下一眼就能看出不同硬盘的分区

感觉用TABS搞成分页比较好吧。RADI勾选才能操作会有点懵

点评

还没研究到那 呢,呵呵,是分页么,我想一页 就 显示 硬盘和分区的数据  详情 回复 发表于 2019-4-4 20:51
回复

使用道具 举报

5#
发表于 2019-4-4 21:02:52 | 显示全部楼层
dos时代菜鸟 发表于 2019-4-4 20:51
还没研究到那 呢,呵呵,是分页么,我想一页 就 显示 硬盘和分区的数据


其实还有一种方法,就是,在上面的TABL表中选定了一个硬盘,下面TABL表就只显示该硬盘的分区。这样可以避免所有分区都显示出来,看起来不那么乱了。但有一点不好,鼠标点一下硬盘,就得刷新一下分区情况、调用几次diskpart,可能会有点不爽。

点评

这个倒是可以做到,不用调用 多次diskpart,因为表里有区分。就是重绘分区列表就行。 但是 要想知道 全部分区情况,就不行了。比如 要选到某个分区,要先把所有硬盘都点一遍才知道。翻到不好  详情 回复 发表于 2019-4-4 21:47
回复

使用道具 举报

6#
发表于 2022-3-26 19:26:36 | 显示全部楼层
dos时代菜鸟 发表于 2022-3-26 19:06
那。。。么。。。换个啥名词好呢?

“溯源”两个字足矣

点评

好的,已经 更新 到 1.27.1 版  详情 回复 发表于 2022-3-26 19:46
en “查祖宗”这个感觉不雅  详情 回复 发表于 2022-3-26 19:33
回复

使用道具 举报

7#
发表于 2022-3-26 21:42:21 | 显示全部楼层
dos时代菜鸟 发表于 2022-3-26 19:46
好的,已经 更新 到 1.27.1 版

1.27进不去了,win7  64bit


点评

怀疑 pecmd 的 exec指令的 管道 功能 在 win7 下 有问题。 但还需要 进一步 研究下。我需要弄个 win7 虚拟机。  详情 回复 发表于 2022-3-26 21:57
1、带 debug 参数 试试 2、1楼有个 1.26.7 版的,不知道 能进不  详情 回复 发表于 2022-3-26 21:47
回复

使用道具 举报

8#
发表于 2022-3-26 22:07:37 | 显示全部楼层
dos时代菜鸟 发表于 2022-3-26 21:57
怀疑 pecmd 的 exec指令的 管道 功能 在 win7 下 有问题。
但还需要 进一步 研究下。我需要弄个 win7 虚 ...

1.26正常,1.27带debug闪一下diskpart窗口,自动关闭了,然后无限计时

点评

实锤 是 pecmd 的 exec| 管道指令在 win7 下失灵。 或许需要 另外的写法。  详情 回复 发表于 2022-3-26 22:17
回复

使用道具 举报

9#
发表于 2022-3-27 11:37:47 | 显示全部楼层
dos时代菜鸟 发表于 2022-3-26 22:17
实锤  是 pecmd 的 exec| 管道指令在 win7 下失灵。
或许需要 另外的写法。
增加一个 参数,原来需要 E ...

OK了

点评

OK  详情 回复 发表于 2022-3-27 12:06
回复

使用道具 举报

10#
发表于 2022-12-6 12:48:41 | 显示全部楼层
dos时代菜鸟 发表于 2022-11-3 20:52
1.27.2 admin 是 x64 的,区别就是 可以 自动提权运行,并且优化了dpi 的情况.



最近在摆弄diskpart的时候,发现了一个致命的问题,就是给diskpart窗口发送中文的时候,变成乱码了,导致命令失败!
暂时没想到啥好办法去解决。


点评

目前的解决办法 是 用 debug 参数运行,然后 当涉及到中文 命令时,直接把 指令组复制粘贴到 黑窗口里 回车。  详情 回复 发表于 2022-12-6 17:59
问题出在 信息发送指令上 ,以 uni 方式 逐个字节发送过去后,就不是汉字了。 如果 能一次 发送一句话,不用 转换 就好了。 ┣━━┿━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  详情 回复 发表于 2022-12-6 16:38
如果是 diskpart.exe 界面 用 ansi 编码 + cp936 限定中文呢?  详情 回复 发表于 2022-12-6 14:32
回复

使用道具 举报

11#
发表于 2022-12-6 18:36:24 | 显示全部楼层
dos时代菜鸟 发表于 2022-12-6 17:59
目前的解决办法 是 用 debug 参数运行,然后 当涉及到中文 命令时,直接把 指令组复制粘贴到 黑窗口里 回 ...

我试过了,chcp 936也不行。由于中文就是占两个字节,只能分两次发送按键,没办法搞了

回复

使用道具 举报

12#
发表于 2022-12-6 18:37:45 | 显示全部楼层
dos时代菜鸟 发表于 2022-12-6 17:59
目前的解决办法 是 用 debug 参数运行,然后 当涉及到中文 命令时,直接把 指令组复制粘贴到 黑窗口里 回 ...

本来想借用你的代码,重新设计diskpart-gui,看来想多了,哈哈哈

点评

弱弱的问一句,能否从头实现,diskpart的bug实在太多了,已经烂透了…  详情 回复 发表于 2022-12-6 22:19
pecmd 自己就能操作vhd  详情 回复 发表于 2022-12-6 19:18
回复

使用道具 举报

13#
发表于 2022-12-6 19:40:50 | 显示全部楼层
dos时代菜鸟 发表于 2022-12-6 19:18
pecmd 自己就能操作vhd

还有地方可能出现中文,比如格式化分区时的卷标。
所以,我放弃常驻内存的diskpart了。

点评

支持中文命令传递。  详情 回复 发表于 2022-12-6 22:14
回复

使用道具 举报

14#
发表于 2022-12-6 22:38:18 | 显示全部楼层
nttwqz 发表于 2022-12-6 22:19
弱弱的问一句,能否从头实现,diskpart的bug实在太多了,已经烂透了…

你说的是获取磁盘信息方面有bug吧?这个我直接用PECMD获取的
回复

使用道具 举报

15#
发表于 2022-12-6 22:38:47 | 显示全部楼层
datbik189 发表于 2022-12-6 22:04
支持中文命令传递的,这是以前讨论时弄的测试脚本。

这么强吗,#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  详情 回复 发表于 2022-12-6 23:18
这是我自己练习PECMD写的一些命令块,哪入得了高手的法眼。  详情 回复 发表于 2022-12-6 22:53
回复

使用道具 举报

16#
发表于 2022-12-7 00:13:52 | 显示全部楼层
本帖最后由 527104427 于 2022-12-7 06:49 编辑
datbik189 发表于 2022-12-6 23:18
传递中文命令需要将命令转化成宽字符。
set. &v=\n  //命令演示: 回车
getf &v,0#*,&v //得到窄字符: 0 ...

明白了,原来是这么个原理!太感谢兄弟了,解决大问题!这样就可以批量搞了:


方法一(code转码):
set^ EnviMode=1
set^ ForceLocal=1
set wm_char=0x0102
set Char=D:\doc\desktop\杂七杂八\研究\本人工具\多磁盘测试\MBR-4个主分区、4096扇区对齐.VHD
exec -pid:cmdpid cmd.exe
wait 500
find --forpid:%cmdpid% --wid* cmdwid,
code **,Char,*unib,CharCodes
sed -ex CharCodes=0,0x{\h+} 0x{\h+},0x\001\002,CharCodes

forx *v CharCodes,KeyCode, set @@sendmsg=%cmdwid%;%wm_char%;%KeyCode%;0


方法二(getf转码):
set^ EnviMode=1
set^ ForceLocal=1
set wm_char=0x0102
set Char=D:\doc\desktop\杂七杂八\研究\本人工具\多磁盘测试\MBR-4个主分区、4096扇区对齐.VHD
exec -pid:cmdpid cmd.exe
wait 500
find --forpid:%cmdpid% --wid* cmdwid,
getf -bin Char,0#*,CharCodes
sed -ex CharCodes=0,0x{\h+} 0x{\h+},0x\002\001,CharCodes

forx *v CharCodes,KeyCode, set @@sendmsg=%cmdwid%;%wm_char%;%KeyCode%;0



回复

使用道具 举报

17#
发表于 2022-12-7 00:14:13 | 显示全部楼层
dos时代菜鸟 发表于 2022-12-6 19:18
pecmd 自己就能操作vhd

已搞定,见楼上代码
回复

使用道具 举报

18#
发表于 2022-12-7 16:00:56 | 显示全部楼层
dos时代菜鸟 发表于 2022-12-7 15:14
已经更新放在一楼

感谢诸位老大,不然我都要考虑 用探测是否存在中文字符,然后 用 diskpart /s 实现带 ...

还是有问题:

select disk 5%nl%detail disk%nl%san%nl%select vdisk file="D:\doc\desktop\动态磁   盘转换成普通  磁盘,有无效分区.vhd" noerr%nl%detail vdisk%nl%

把以上代码一次性发过去,会被截断一部分,造成报错,提示找不到vhd。
只能先发送一行,成功再继续下一行。

点评

cmd和diskpart一样,只支持单行命令, 多行命令得使用脚本文件.  详情 回复 发表于 2022-12-7 16:55
是因为有空格 ,还是 有 noerr ? noerr 是只有 脚本中采用的,如果直接发指令,不用这个参数。  详情 回复 发表于 2022-12-7 16:15
回复

使用道具 举报

19#
发表于 2022-12-7 16:31:50 | 显示全部楼层
dos时代菜鸟 发表于 2022-12-7 16:15
是因为有空格 ,还是 有 noerr ?

noerr 是只有 脚本中采用的,如果直接发指令,不用这个参数。

并不是noerr和空格的问题。
应该是命令长度有限制。

点评

我感觉应该是 diskpart 命令解析要求 一行一行的执行。 你用 ENVI. 联合 \n 做一个 多行变量,再用 forx 逐行发过去看看。  详情 回复 发表于 2022-12-7 16:40
回复

使用道具 举报

20#
发表于 2022-12-7 16:58:20 | 显示全部楼层
dos时代菜鸟 发表于 2022-12-7 16:40
我感觉应该是 diskpart 命令解析要求 一行一行的执行。
你用 ENVI. 联合 \n  做一个 多行变量,再用 for ...

那没事了,我以为你跟我一样,是一次性发个全家桶过去。
回复

使用道具 举报

21#
发表于 2022-12-7 16:59:10 | 显示全部楼层
datbik189 发表于 2022-12-7 16:55
cmd和diskpart一样,只支持单行命令, 多行命令得使用脚本文件.

了解,看来还是得一步步来
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-7 01:04

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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