无忧启动论坛

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

[更新376#2825]PECMD2012.1.80.13_Win32_64.多窗口多线程.裸机系统2.3.3.1+18M酷M...

    [复制链接]
14281#
发表于 2019-7-10 22:26:41 | 只看该作者
datbik189 发表于 2019-7-10 22:20
exec* @edit=!cmd /c diskpart 变成 exec* &edit=*cmd /c diskpart, 再看看。现在不在电脑前,明天看 ...

好的,我也得明天才能在那个 特殊的问题环境 测试。
回复

使用道具 举报

14282#
发表于 2019-7-10 22:28:19 | 只看该作者
datbik189 发表于 2019-7-10 22:12
晕,有没有重现问题的最简短的脚本,那么多,眼花完了

简单的不出这毛病,我用 pecmd 给diskpart 做的外壳,也是这么大代码量的ini 也没出这毛病。

点评

应该是那个@的问题,我从没使用过这种方法  详情 回复 发表于 2019-7-10 22:40
回复

使用道具 举报

14283#
发表于 2019-7-10 22:40:48 来自手机 | 只看该作者
dos时代菜鸟 发表于 2019-7-10 22:28
简单的不出这毛病,我用 pecmd 给diskpart 做的外壳,也是这么大代码量的ini 也没出这毛病。

应该是那个@的问题,我从没使用过这种方法
回复

使用道具 举报

14284#
发表于 2019-7-10 23:04:08 | 只看该作者
PART命令中的-iv=如果能接负数,比如-1,像MSTR那样就更方便了
回复

使用道具 举报

14285#
发表于 2019-7-10 23:09:05 | 只看该作者
dos时代菜鸟 发表于 2019-7-10 21:56
好像跟 带& 变量的使用有关,只在我的环境 特定系统的特定 点上有问题。很是奇怪。
windows 10 环境下, ...

你代码里用到
exec* @edit
的地方太多了,到底哪里卡死了。你定位一个位置出来啊,这样让人慢慢找,耽误功夫哦。

点评

就单单 run_diskpart 段 有这个问题, 当dp_script 包含分区格式化指令的时候卡死。 换成 或者 就可以了。  详情 回复 发表于 2019-7-11 07:52
回复

使用道具 举报

14286#
发表于 2019-7-11 07:52:54 | 只看该作者
红毛樱木 发表于 2019-7-10 23:09
你代码里用到
exec* @edit
的地方太多了,到底哪里卡死了。你定位一个位置出来啊,这样让人慢慢找,耽 ...

就单单  run_diskpart 段 有这个问题,

  1.       exec* @edit_mess=*cmd.exe /c " type %dp_script% | diskpart.exe "
复制代码


当dp_script 包含分区格式化指令的时候卡死。

换成
  1.       exec* @edit_mess+=*cmd.exe /c " type %dp_script% | diskpart.exe "
复制代码

或者
  1.       exec  =*cmd.exe /c " type %dp_script% | diskpart.exe "
复制代码

就可以了。

点评

不知道怎么测试, 脚本运行没问题,帮不上忙. 建议脚本开头加上 ENVI^ ENVIMODE=1 这个才是PECMD2012的标准模式, 不加好像会有莫名的未知问题. 调试时在脚本开头加上 LOGS --2 *XX.LOG [attachimg]396851[  详情 回复 发表于 2019-7-11 08:25
回复

使用道具 举报

14287#
发表于 2019-7-11 08:25:21 | 只看该作者
dos时代菜鸟 发表于 2019-7-11 07:52
就单单  run_diskpart 段 有这个问题,


不知道怎么测试, 脚本运行没问题,帮不上忙.

建议脚本开头加上 ENVI^ ENVIMODE=1
这个才是PECMD2012的标准模式, 不加好像会有莫名的未知问题.

调试时在脚本开头加上 LOGS --2 *XX.LOG

点评

谢谢  详情 回复 发表于 2019-7-11 09:12
回复

使用道具 举报

14288#
发表于 2019-7-11 09:12:08 | 只看该作者
datbik189 发表于 2019-7-11 08:25
不知道怎么测试, 脚本运行没问题,帮不上忙.

建议脚本开头加上 ENVI^ ENVIMODE=1

谢谢

点评

exec* @edit_mess+=*cmd.exe /c " type %dp_script% | diskpart.exe " 这句不卡,就没问题喽  详情 回复 发表于 2019-7-11 09:39
回复

使用道具 举报

14289#
发表于 2019-7-11 09:39:11 | 只看该作者

exec* @edit_mess+=*cmd.exe /c " type %dp_script% | diskpart.exe "
这句不卡,就没问题喽
回复

使用道具 举报

14290#
发表于 2019-7-11 10:58:34 | 只看该作者
pecmd 有办法 向 某个进程传递指令么?
比如

  1. call @cmd_win
  2. _Sub cmd_win,h280 w400 ,cmd,kill *%cmdpid%
  3.       edit-| cmd_edit, L10 t10 h180 w380,,,0x220
  4.       item cmd_but,  L20 t200 h20 w50,cmd,exec* -io -pid:cmdpid @cmd_edit=*cmd.exe
  5. _end
复制代码


cmd_but 按钮以后,
窗口 编辑框 cmd_edit 接管了 cmd 的输入输出,如何 向 cmd 输入一条指令,显示到 cmd_edit 空间上?

点评

是不是可以通过窗口消息发送字符串信息给diskpart窗口,不知道这样行不行  详情 回复 发表于 2019-7-12 00:16
pecmd没有这么厉害吧。 是不是可以,ExEc* @V=*cmd.exe /c a.bat,a.bat内容是无限循环,满足一定条件就call b.bat,否则什么也不干. b.bat里面就是你要传递的指令,用Writ命令修改其内容。  详情 回复 发表于 2019-7-11 12:37
回复

使用道具 举报

14291#
发表于 2019-7-11 12:37:01 来自手机 | 只看该作者
dos时代菜鸟 发表于 2019-7-11 10:58
pecmd 有办法 向 某个进程传递指令么?
比如


pecmd没有这么厉害吧。

是不是可以,ExEc* @V=*cmd.exe /c a.bat,a.bat内容是无限循环,满足一定条件就call b.bat,否则什么也不干. b.bat里面就是你要传递的指令,用Writ命令修改其内容。

点评

vbs 有 输入输出 接管的。 我以为 pecmd 2012 也有呢,这个主要考虑是 用到 diskpart 上,因为 有的电脑 频繁调用 diskpart 会很烦,很慢。 所以我想的就是 隐藏调用一个 Diskpart ,就放在那里 挂着,需要用 disk  详情 回复 发表于 2019-7-11 14:55
回复

使用道具 举报

14292#
发表于 2019-7-11 14:55:38 | 只看该作者
datbik189 发表于 2019-7-11 12:37
pecmd没有这么厉害吧。

是不是可以,ExEc* @V=*cmd.exe /c a.bat,a.bat内容是无限循环,满足一定条件 ...

vbs 有 输入输出 接管的。
我以为 pecmd 2012 也有呢,这个主要考虑是 用到 diskpart 上,因为 有的电脑 频繁调用 diskpart 会很烦,很慢。
所以我想的就是 隐藏调用一个 Diskpart ,就放在那里 挂着,需要用 diskpart 的时候就 传给他一个 指令 ,然后 根据结果分析出想要的信息。这样,就只需要 调用一次 diskpart 。

点评

logs --2 * xx.log envi^ envimode=1 call @cmd_win _Sub cmd_win,h280 w400 ,cmd,kill *%cmdpid% edit-| cmd_edit, L10 t10 h180 w380,,,0x220 set &cmd=for /l %%i in (1,0,1) do @"%myname%" wa  详情 回复 发表于 2019-7-11 17:54
回复

使用道具 举报

14293#
发表于 2019-7-11 15:03:37 | 只看该作者
本帖最后由 datbik189 于 2019-7-11 17:55 编辑

重复了...
回复

使用道具 举报

14294#
发表于 2019-7-11 17:54:59 | 只看该作者
dos时代菜鸟 发表于 2019-7-11 14:55
vbs 有 输入输出 接管的。
我以为 pecmd 2012 也有呢,这个主要考虑是 用到 diskpart 上,因为 有的电脑 ...

logs --2 * xx.log
envi^ envimode=1
call @cmd_win
_Sub cmd_win,h280 w400 ,cmd,kill *%cmdpid%
      edit-| cmd_edit, L10 t10 h180 w380,,,0x220
      set &cmd=for /l %%i in (1,0,1) do @"%myname%" wait 500&call b.bat
      item cmd_but,  L20 t200 h20 w50,cmd,exec* -io -pid:cmdpid @cmd_edit=*cmd.exe /c %&cmd%
_end

b.bat内容可为:
(echo sel disk 0&echo list partition)|diskpart
::没有exit命令, diskpart就常驻内存,再次运行就飞快
或者 diskpart /s script.txt
@del %0>nul

点评

感觉这样不是真的 留有 一个diskpart 进程,diskpart 会随着call b.bat 而被多次调用。 可以探测下 diskpart 的进程号,是在变化的。 之所以再次运行 快了,是因为 diskpart 运行过一次,第二次就会快一些。  详情 回复 发表于 2019-7-11 23:51
回复

使用道具 举报

14295#
发表于 2019-7-11 23:51:42 | 只看该作者
datbik189 发表于 2019-7-11 17:54
logs --2 * xx.log
envi^ envimode=1
call @cmd_win

感觉这样不是真的 留有 一个diskpart 进程,diskpart 会随着call b.bat 而被多次调用。

可以探测下 diskpart 的进程号,是在变化的。

之所以再次运行 快了,是因为 diskpart 运行过一次,第二次就会快一些。

点评

感觉这样调用最好, 因为你不知道diskpart运行每一条命令所需的时间. exec* &V=*diskpart.exe /s script.txt 获取回显是在diskpart 运行结束之后. 查看了一下论坛以前的记录, 向挂起的diskpart.exe发送一条命令  详情 回复 发表于 2019-7-17 10:51
回复

使用道具 举报

14296#
发表于 2019-7-12 00:16:10 来自手机 | 只看该作者
dos时代菜鸟 发表于 2019-7-11 10:58
pecmd 有办法 向 某个进程传递指令么?
比如


是不是可以通过窗口消息发送字符串信息给diskpart窗口,不知道这样行不行

点评

我最初就是这个想法,但是不知道怎么实现。 不知道pecmd 能不能 通过 dpi 精准找到 diskpart 的窗口,并发送字符串。 是不是还要用到 系统 api dll 啥的?这个我就更不明白了。  详情 回复 发表于 2019-7-12 08:19
回复

使用道具 举报

14297#
发表于 2019-7-12 08:19:40 | 只看该作者
红毛樱木 发表于 2019-7-12 00:16
是不是可以通过窗口消息发送字符串信息给diskpart窗口,不知道这样行不行

我最初就是这个想法,但是不知道怎么实现。
不知道pecmd 能不能 通过 dpi 精准找到 diskpart 的窗口,并发送字符串。

是不是还要用到 系统 api dll 啥的?这个我就更不明白了。
回复

使用道具 举报

14298#
发表于 2019-7-14 21:32:04 | 只看该作者
+111111111111111回帖是一种美德
回复

使用道具 举报

14299#
发表于 2019-7-15 23:00:18 | 只看该作者
4K扇区原生磁盘,无法用PECMD2012的PART命令来操作分区了。
用其中的-CHS指定参数也不行。
回复

使用道具 举报

14300#
发表于 2019-7-17 10:47:25 | 只看该作者
本帖最后由 datbik189 于 2019-7-17 10:50 编辑

重复了...
回复

使用道具 举报

14301#
发表于 2019-7-17 10:51:26 | 只看该作者
本帖最后由 datbik189 于 2019-7-17 11:25 编辑
dos时代菜鸟 发表于 2019-7-11 23:51
感觉这样不是真的 留有 一个diskpart 进程,diskpart 会随着call b.bat 而被多次调用。

可以探测下 di ...


感觉这样调用最好, 因为你不知道diskpart运行每一条命令所需的时间.

exec* &V=*diskpart.exe /s script.txt 获取回显是在diskpart 运行结束之后.

查看了一下论坛以前的记录, 向挂起的diskpart.exe发送一条命令的脚本为:

ENVI @@SENDMSG=窗口ID号;0x102;宽字符(16进制)

测试脚本通过,没问题.

先运行sel disk 0 和 运行 list partition



后运行 list volume



logs --2 * xx.log
envi^ envimode=1
thread -here -tid:&A call @cmd_win
_Sub cmd_win,h280 w400 ,cmd,kill *%cmdpid%
      edit-| cmd_edit, L10 t10 h180 w380,,,0x220
      item cmd_but,  L20 t200 h20 w50,cmd,exec* -io -pid:cmdpid @cmd_edit=*diskpart
_end
loop #1=1,find diskpart.exe,exit loop!wait 500
wait 1000
set &V1=%cmdpid%
find --wid*@. &V
load #999*命令_find.exe &V 匹配 &V1
team mstr * &wid=<2>&V|calc -base=16 &wid=%&wid%
set. &ch=sel disk 0\nlist partition\n
load #999*命令_宽字符 &ch
forx * %&ch%,&v1,ENVI @@SENDMSG=%&WID%;0x102;0x%&V1%
wait 500
mess. %cmd_edit%
set. &ch=list volume\n
load #999*命令_宽字符 &ch
forx * %&ch%,&v1,ENVI @@SENDMSG=%&WID%;0x102;0x%&V1%
wait 50
mess. %cmd_edit%
wait *=%&A%

PECMD.EXE

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

点评

这个好。必须学会。  详情 回复 发表于 2019-7-17 12:12
牛!还能这么玩的啊,学习了。  详情 回复 发表于 2019-7-17 12:01
回复

使用道具 举报

14302#
发表于 2019-7-17 12:01:36 | 只看该作者
datbik189 发表于 2019-7-17 10:51
感觉这样调用最好, 因为你不知道diskpart运行每一条命令所需的时间.

exec* &V=*diskpart.exe /s scr ...

牛!还能这么玩的啊,学习了。

点评

汗,这是M大很早以前给出的示范脚本,我只搬运工  详情 回复 发表于 2019-7-17 12:47
回复

使用道具 举报

14303#
发表于 2019-7-17 12:12:56 | 只看该作者
本帖最后由 dos时代菜鸟 于 2019-7-17 12:34 编辑
datbik189 发表于 2019-7-17 10:51
感觉这样调用最好, 因为你不知道diskpart运行每一条命令所需的时间.

exec* &V=*diskpart.exe /s scr ...


这个好。必须学会。

load #999*命令_宽字符 &ch
这个命令 怎么来的?

点评

看了一下,这个方法就是挨个把字母转换成按键编码,再挨个发送给diskpart 前提是得把所有英文字母的十六进制通过手工查询出来,再保存到文件,以供脚本查询,并不是直接发送字符串。 但有几个问题需要解决: 1.  详情 回复 发表于 2019-7-17 18:36
自己写的命令块,参考 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=414172  详情 回复 发表于 2019-7-17 12:37
回复

使用道具 举报

14304#
发表于 2019-7-17 12:37:53 来自手机 | 只看该作者
本帖最后由 datbik189 于 2019-7-17 12:41 编辑
dos时代菜鸟 发表于 2019-7-17 12:12
这个好。必须学会。

load #999*命令_宽字符 &ch


附件中的PECMD中的命令块,内置在ScriPt下序号999
参考 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=414172
回复

使用道具 举报

14305#
发表于 2019-7-17 12:47:48 来自手机 | 只看该作者
527104427 发表于 2019-7-17 12:01
牛!还能这么玩的啊,学习了。


汗,这是M大很早以前给出的示范脚本,我只是搬运工
回复

使用道具 举报

14306#
发表于 2019-7-17 18:36:14 | 只看该作者
dos时代菜鸟 发表于 2019-7-17 12:12
这个好。必须学会。

load #999*命令_宽字符 &ch

看了一下,这个方法就是挨个把字母转换成按键编码,再挨个发送给diskpart
前提是得把所有英文字母的十六进制通过手工查询出来,再保存到文件,以供脚本查询,并不是直接发送字符串。

但有几个问题需要解决:
1.此方法只适用于win7以上的系统,win7没办法保留diskpart窗口,运行就直接退出了
2.不捕获输出的话,倒是可以保留diskpart窗口,而且必需开两个CMD:exec =cmd cmd /k diskpart

所以,要保证通用性,就得解决上面提到的问题,目前我觉得是无解。不过据说win7要死掉了,不支持win7貌似也说得过去。

根本就捕获不到diskpart窗口ID,如图:



点评

请教老司机:PECMD有什么指令能用来处理文本文件的字符串(查找和替换)? 我查看了帮助,WIRT 可以处理文本文件的字符串,但是只能以行为单位来处理。 我需要再CMD脚本中以指定的字符串为单位来处理,比如将“d  详情 回复 发表于 2019-7-18 09:45
手上没有WIN7,无法测试。 如果diskpart不能常驻内存,这个脚本就没有意义了。 关于字符串,支持汉字,可以直接输入,自己转化成宽字符,不需要查询按键的额外工作  详情 回复 发表于 2019-7-17 18:53
回复

使用道具 举报

14307#
发表于 2019-7-17 18:53:07 来自手机 | 只看该作者
527104427 发表于 2019-7-17 18:36
看了一下,这个方法就是挨个把字母转换成按键编码,再挨个发送给diskpart
前提是得把所有英文字母的十六 ...

手上没有WIN7,无法测试。

如果diskpart不能常驻内存,这个脚本就没有意义了。

关于字符串,支持汉字,可以直接输入,自己转化成宽字符,不需要查询按键的额外工作

点评

/s就不在后台了吧。不带/s我试了可以。  详情 回复 发表于 2019-7-17 21:29
哦,一下给忘了,可以CODE转码。  详情 回复 发表于 2019-7-17 19:08
回复

使用道具 举报

14308#
发表于 2019-7-17 19:08:00 | 只看该作者
datbik189 发表于 2019-7-17 18:53
手上没有WIN7,无法测试。

如果diskpart不能常驻内存,这个脚本就没有意义了。

哦,一下给忘了,可以CODE转码。
回复

使用道具 举报

14309#
发表于 2019-7-17 21:29:45 | 只看该作者
datbik189 发表于 2019-7-17 18:53
手上没有WIN7,无法测试。

如果diskpart不能常驻内存,这个脚本就没有意义了。

/s就不在后台了吧。不带/s我试了可以。

点评

5大测试了14309楼的PECMD和代码,Win7的系统diskpart不能挂着和常驻内存,方便的话麻烦试下,发Log上来。  详情 回复 发表于 2019-7-17 21:43
回复

使用道具 举报

14310#
发表于 2019-7-17 21:43:28 来自手机 | 只看该作者
红毛樱木 发表于 2019-7-17 21:29
/s就不在后台了吧。不带/s我试了可以。

5大测试了14309楼的PECMD和代码,Win7的系统diskpart不能挂着和常驻内存,方便的话麻烦试下,发Log上来。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-7-6 04:53

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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