无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
楼主: dos时代菜鸟
打印 上一主题 下一主题

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

    [复制链接]
331#
发表于 2022-11-3 07:56:48 来自手机 | 只看该作者
我顶,什么时候测试版可改为正式版呢?

点评

或许 没有正式版,一直在测试。  详情 回复 发表于 2022-11-3 18:47
回复

使用道具 举报

332#
发表于 2022-11-3 17:30:06 | 只看该作者
看看楼主分享的教程,学习一下啊
回复

使用道具 举报

333#
 楼主| 发表于 2022-11-3 18:47:08 | 只看该作者
银狼驰骋 发表于 2022-11-3 07:56
我顶,什么时候测试版可改为正式版呢?

或许 没有正式版,一直在测试。

点评

现在我应该下哪个呢?1.27.2 admin 测试 还是 1.27 单diskpart进程版  详情 回复 发表于 2022-11-3 20:22
回复

使用道具 举报

334#
发表于 2022-11-3 20:22:10 | 只看该作者
dos时代菜鸟 发表于 2022-11-3 18:47
或许 没有正式版,一直在测试。

现在我应该下哪个呢?1.27.2 admin 测试  还是  1.27 单diskpart进程版

点评

1.27.2 admin 是 x64 的,区别就是 可以 自动提权运行,并且优化了dpi 的情况.  详情 回复 发表于 2022-11-3 20:52
回复

使用道具 举报

335#
 楼主| 发表于 2022-11-3 20:52:50 | 只看该作者
银狼驰骋 发表于 2022-11-3 20:22
现在我应该下哪个呢?1.27.2 admin 测试  还是  1.27 单diskpart进程版

1.27.2 admin 是 x64 的,区别就是 可以 自动提权运行,并且优化了dpi 的情况.

点评

最近在摆弄diskpart的时候,发现了一个致命的问题,就是给diskpart窗口发送中文的时候,变成乱码了,导致命令失败! 暂时没想到啥好办法去解决。 [attachimg]514428[/attachimg]  详情 回复 发表于 2022-12-6 12:48
回复

使用道具 举报

336#
发表于 2022-11-3 21:03:22 | 只看该作者
明白
回复

使用道具 举报

337#
发表于 2022-11-20 12:21:34 | 只看该作者
感谢分享
回复

使用道具 举报

338#
发表于 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
回复

使用道具 举报

339#
 楼主| 发表于 2022-12-6 14:32:23 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-12-6 15:11 编辑
527104427 发表于 2022-12-6 12:48
最近在摆弄diskpart的时候,发现了一个致命的问题,就是给diskpart窗口发送中文的时候,变成乱码了, ...

如果是 diskpart.exe 界面 用 ansi 编码 + cp936 限定中文呢?
不知道 pecmd 窗口内容 是否可以做 大字符集限定。

问题应该 在  pecmd 的  code 指令上。
回复

使用道具 举报

340#
 楼主| 发表于 2022-12-6 16:38:56 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-12-6 16:49 编辑
527104427 发表于 2022-12-6 12:48
最近在摆弄diskpart的时候,发现了一个致命的问题,就是给diskpart窗口发送中文的时候,变成乱码了, ...

问题出在 信息发送指令上 ,以 uni 方式 逐个字节发送过去后,就不是汉字了。
如果 能一次 发送一句话,不用 转换 就好了。









┣━━┿━━┿━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃    │命令│'消息映射'                                                                                  ┃
┃    ├──┼──────────────────────────────────────────────┨
┃    │参数│■ENVI @窗口和控件名.MSG=[_$*+]消息号:[:[wPrm参数名],[lPrm参数名],]执行命令//定义消息映射捕 ┃
┃    │    │  捉默认前部命令;_为后部命令;$为替代命令,不执行系统响应,此时能返回结果码;*用于捕鼠器B的命┃
┃    │    │  令。+为超级捕捉。“执行命令”以-号开始,则从所在窗口开始执行(执行栈)。                  ┃
┃    │    │■ENVI @窗口和控件名.POSTMSG=[:变量名;]消息号[;参数wPrm[;参数lPrm]]     //异步发送消息      ┃
┃    │    │■ENVI @窗口和控件名.SENDMSG=[:变量名;]消息号[;参数wPrm[;参数lPrm]]     //同步发送消息      ┃
┃    │    │■ENVI @@POSTMSG=[:变量名;]窗口号;消息号[;参数wPrm[;参数lPrm]]          //异步发送消息      ┃
┃    │    │■ENVI @@SENDMSG=[:变量名;]窗口号;消息号[;参数wPrm[;参数lPrm]]          //同步发送消息      ┃
┃    │    │  上两个的窗口号可为*[?等待超时[?间隔]][*窗口类*][标题]                                     ┃
┃    │    │■适用于_SUB窗口和控件。消息号见:WM_消息.WCS,可以IMPORT . 变量名返回结果(含义因消息而定)  ┃
┃    │    │■消息号以#开头为PECMD应用自定义消息1-N。wPrm lPrm参数名, 参数名可以被引用。等号后的_表示下 ┃
┃    │    │  半部响应模式,在系统响应之后响应【对衍生消息会以相反的顺序响应】。 上面;可以用逗号。      ┃
┃    │    │  消息参数可以是数字,@PE变量名(ENVI$# 填充非字符串对象),$字符串(只适用于SENDMSG)。    ┃
┃    │    │  .MSG=的消息号可为:<COMMAND|NOTIFY>#[控件ID][#小消息号]。                                 ┃
┃消息├──┼──────────────────────────────────────────────┨
┃映射│示例│ ENVI @窗口1.MSG=#1::wp,lp,MESS- HELLO wp=[%wp%],lp=[%lp%]@#OK                              ┃
┃    │    │ ENVI @窗口1.POSTMSG=#1,1,2             //触发#1消息                                        ┃
┃    │    │ ENVI @窗口1.MSG=%&WM_LBUTTONUP%:MESS 你单击了                                              ┃
┃    │    │ ENVI @Edit1.MSG=%&WM_MOUSEENTER%:ENVI @Edit1=鼠标进来了                                    ┃
┃    │    │ ENVI @@SENDMSG=%__WinID%:#2;@str1;@str2   或  ENVI @@SENDMSG=%__WinID%:#2;$Line11;$abc11   ┃
┃    ├──┼──────────────────────────────────────────────┨
┃    │范例│PECMD怎样获取CMD命令行的回显?(不通过临时文件)如要获取CMD命令“dir d: /d”的回显          ┃
┃    ├──┼──────────────────────────────────────────────┨
┃    │    │ EXEC*  &V=!cmd.exe /c dir d: /d                                                            ┃
┃    │    │ MESS. [%&V%]@DEBUG#OK                                                                      ┃
┃    ├──┼──────────────────────────────────────────────┨
┃    │备注│ ※EXEC 还可将命令的输出实时显示在控件上(如EDIT/MEMO/LABE),详细请参阅EXEC命令的说明。      ┃


回复

使用道具 举报

341#
 楼主| 发表于 2022-12-6 17:59:37 | 只看该作者
527104427 发表于 2022-12-6 12:48
最近在摆弄diskpart的时候,发现了一个致命的问题,就是给diskpart窗口发送中文的时候,变成乱码了, ...

目前的解决办法 是 用 debug 参数运行,然后 当涉及到中文 命令时,直接把 指令组复制粘贴到 黑窗口里 回车。

点评

д  详情 回复 发表于 2022-12-6 22:04
本来想借用你的代码,重新设计diskpart-gui,看来想多了,哈哈哈 [attachimg]514444[/attachimg]  详情 回复 发表于 2022-12-6 18:37
我试过了,chcp 936也不行。由于中文就是占两个字节,只能分两次发送按键,没办法搞了 [attachimg]514443[/attachimg]  详情 回复 发表于 2022-12-6 18:36
回复

使用道具 举报

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

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

回复

使用道具 举报

343#
发表于 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
回复

使用道具 举报

344#
 楼主| 发表于 2022-12-6 19:18:45 来自手机 | 只看该作者
527104427 发表于 2022-12-6 18:37
本来想借用你的代码,重新设计diskpart-gui,看来想多了,哈哈哈

pecmd 自己就能操作vhd

点评

已搞定,见楼上代码  详情 回复 发表于 2022-12-7 00:14
还有地方可能出现中文,比如格式化分区时的卷标。 所以,我放弃常驻内存的diskpart了。  详情 回复 发表于 2022-12-6 19:40
回复

使用道具 举报

345#
发表于 2022-12-6 19:40:50 | 只看该作者
dos时代菜鸟 发表于 2022-12-6 19:18
pecmd 自己就能操作vhd

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

点评

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

使用道具 举报

346#
发表于 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

点评

这么强吗,#999是啥宝贝,能偷偷分享一下吗  详情 回复 发表于 2022-12-6 22:38
回复

使用道具 举报

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

支持中文命令传递。
回复

使用道具 举报

348#
发表于 2022-12-6 22:19:08 来自手机 | 只看该作者
527104427 发表于 2022-12-6 18:37
本来想借用你的代码,重新设计diskpart-gui,看来想多了,哈哈哈

弱弱的问一句,能否从头实现,diskpart的bug实在太多了,已经烂透了…

点评

你说的是获取磁盘信息方面有bug吧?这个我直接用PECMD获取的  详情 回复 发表于 2022-12-6 22:38
回复

使用道具 举报

349#
发表于 2022-12-6 22:38:18 | 只看该作者
nttwqz 发表于 2022-12-6 22:19
弱弱的问一句,能否从头实现,diskpart的bug实在太多了,已经烂透了…

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

使用道具 举报

350#
发表于 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
回复

使用道具 举报

351#
发表于 2022-12-6 22:53:01 | 只看该作者
本帖最后由 conlin888 于 2022-12-6 22:54 编辑
527104427 发表于 2022-12-6 22:38
这么强吗,#999是啥宝贝,能偷偷分享一下吗

我也要。
回复

使用道具 举报

352#
发表于 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

点评

明白了,原来是这么个原理!这样就可以批量搞了: set^ EnviMode=1 set^ ForceLocal=1 set wm_char=0x0102 set wid=971982 //diskpart窗口ID set Char=D:\doc\desktop\杂七杂八\研究\本人工具\多磁盘测试\MBR  详情 回复 发表于 2022-12-7 00:13

评分

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

查看全部评分

回复

使用道具 举报

353#
发表于 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



回复

使用道具 举报

354#
发表于 2022-12-7 00:14:13 | 只看该作者
dos时代菜鸟 发表于 2022-12-6 19:18
pecmd 自己就能操作vhd

已搞定,见楼上代码
回复

使用道具 举报

355#
 楼主| 发表于 2022-12-7 14:15:56 | 只看该作者
527104427 发表于 2022-12-7 00:14
已搞定,见楼上代码



回复

使用道具 举报

356#
 楼主| 发表于 2022-12-7 15:14:37 | 只看该作者
已经更新放在一楼

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

点评

还是有问题: select disk 5%nl%detail disk%nl%san%nl%select vdisk file="D:\doc\desktop\动态磁 盘转换成普通 磁盘,有无效分区.vhd" noerr%nl%detail vdisk%nl% 把以上代码一次性发过去,会被截断一部  详情 回复 发表于 2022-12-7 16:00
回复

使用道具 举报

357#
发表于 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
回复

使用道具 举报

358#
 楼主| 发表于 2022-12-7 16:15:01 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-12-7 16:25 编辑
527104427 发表于 2022-12-7 16:00
还是有问题:

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

是因为有空格 ,还是 有 noerr ?

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

可以 用 envi. 做一个多行变量 ,我都是用 \n 做回车,不用 %NL%.

而且,确实需要 逐行发送指令,需要 时刻关注 输出结果,判断指令是否已经运行完了。


点评

并不是noerr和空格的问题。 应该是命令长度有限制。  详情 回复 发表于 2022-12-7 16:31
回复

使用道具 举报

359#
发表于 2022-12-7 16:31:50 | 只看该作者
dos时代菜鸟 发表于 2022-12-7 16:15
是因为有空格 ,还是 有 noerr ?

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

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

点评

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

使用道具 举报

360#
 楼主| 发表于 2022-12-7 16:40:18 | 只看该作者
本帖最后由 dos时代菜鸟 于 2022-12-7 16:48 编辑
527104427 发表于 2022-12-7 16:31
并不是noerr和空格的问题。
应该是命令长度有限制。

我感觉应该是 diskpart 命令解析要求 一行一行的执行。
你用 ENVI. 联合 \n  做一个 多行变量,再用 forx 逐行发过去看看。

我这边弄了个 超长中文带多个空格的vhd 名字,用脚本一样能正常加载和卸载。

用 envi.  带 .


点评

那没事了,我以为你跟我一样,是一次性发个全家桶过去。  详情 回复 发表于 2022-12-7 16:58
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-15 12:27

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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