无忧启动论坛

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

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

    [复制链接]
5101#
发表于 2013-3-31 21:33:52 | 只看该作者
原帖由 mdyblog 于 2013-3-31 21:02 发表


写了个新版, 到时能处理 变量路径的IMPORT, LOAD **mem 等也可以。
注意 LOAD **mem  是的路径。
我在测试一下。

---好了  PECMD2012.1.75.1-130314-26.多窗口线程孵化版_win32_64.sfx
SET &MyDir=D:\TEMP
SET &&WCS=IMPORT %MyDir%\L1.WCS
LOAD **mem &WCS 11 22 33

这个在 LOAD **mem 前实际上已经展开过了吧,这样倒是没有问题的。

IMPORT %&MyDir% 这种还是不要支持的好,支持 %CurDir% 就可以,不然的话如果遇到这种情况:
SET &D=C:\temp
IMPORT L1.wcs

IMPORT %&D%\L2.wcs

可能会出现混乱,因为 IMPORT 是就地展开的,L1.wcs 万一有修改变量 D 的代码会造成第2个IMPORT的结果不可预期,还是只支持系统环境变量和内置固定变量就好,这样应该也是足够用的了,更复杂的要求应该也可以通过其他方式完成,不需要以增加代码不可预期性为代价来满足那种需求。
回复

使用道具 举报

5102#
发表于 2013-3-31 21:35:59 | 只看该作者
原帖由 mdyblog 于 2013-3-31 21:26 发表

IMPORT 只用到%CurDir% 等目录 变量。

%CurDir%:为当前 目录; 可有PATH@提前设定

运行时:
%CurDir%:为 当前目录
%CurFiler%:为 当前目录\#mem

这样也行,不过建议把 #mem改成 **mem,因为 #mem 实际上是一个合法的文件名,可能会引起混淆。

[ 本帖最后由 2010qaqz111 于 2013-3-31 21:40 编辑 ]
回复

使用道具 举报

5103#
 楼主| 发表于 2013-3-31 22:00:50 | 只看该作者
原帖由 2010qaqz111 于 2013-3-31 21:33 发表

这个在 LOAD **mem 前实际上已经展开过了吧,这样倒是没有问题的。

IMPORT %&MyDir% 这种还是不要支持的好,支持 %CurDir% 就可以,不然的话如果遇到这种情况:

可能会出现混乱,因为 IMPORT 是就地展开 ...


SET &D=C:\temp
IMPORT L1.wcs

IMPORT %&D%\L2.wcs

这个不影响。
上面 SET &D=C:\temp 对下面的 【IMPORT %&D%\L2.wcs】 没影响。
SET &D=C:\temp 在运行时才执行, 此时 【IMPORT %&D%\L2.wcs】  早处理了。

IMPORT %&D%\L2.wcs
中的  %&D% 取决于 LOAD 他的文件 及时机。
LOAD 前 修改  &D 才有效。
回复

使用道具 举报

5104#
发表于 2013-3-31 22:09:45 | 只看该作者
原帖由 mdyblog 于 2013-3-31 22:00 发表


SET &D=C:\temp
IMPORT L1.wcs

IMPORT %&D%\L2.wcs

这个不影响。
上面 SET &D=C:\temp 对下面的 【IMPORT %&D%\L2.wcs】 没影响。
SET &D=C:\temp 在运行时才执行, 此时 【IMPORT %&D%\L2.wcs】  ...

明白了,这样就没问题了。
回复

使用道具 举报

5105#
 楼主| 发表于 2013-3-31 22:37:29 | 只看该作者
原帖由 2010qaqz111 于 2013-3-31 22:09 发表

明白了,这样就没问题了。

PECMD2012.1.75.1-130314-27.

#mem 改为  **mem


CODE  对串也支持 -BOM
  1. GETF#  L1.WCS,0#*,&&L1
  2. CODE **-BOM,&L1,**-,&&L2
复制代码
回复

使用道具 举报

5106#
发表于 2013-4-1 00:44:13 | 只看该作者
新的 EXEC --clone: 用法里面,--exe: 是必须的吗?这个 --exe 填其他非 pecmd.exe 的 exe 路径会是什么效果?
回复

使用道具 举报

5107#
 楼主| 发表于 2013-4-1 07:41:20 | 只看该作者
原帖由 2010qaqz111 于 2013-4-1 00:44 发表
新的 EXEC --clone: 用法里面,--exe: 是必须的吗?这个 --exe 填其他非 pecmd.exe 的 exe 路径会是什么效果?


不必。 默认就是 自己的 克隆。 默认 就等于  --exe:"%MyName%"
这里  --exe:  可以用来执行另一份拷贝, 或另一个版本的PECMD.EXE。
非  PECMD.EXE   或不兼容的 PECMD.EXE,不行的。 如用4.0就不可以的。
克隆执行, 被调用的程序都有特别的设计支持。 否则只是启动它而已, 它不会接着做希望的工作。

如CALC.EXE , 就启动一个 CALC 而已。

[ 本帖最后由 mdyblog 于 2013-4-1 07:42 编辑 ]
回复

使用道具 举报

5108#
 楼主| 发表于 2013-4-1 08:49:44 | 只看该作者

ENVI SET 增加性开关

原帖由 2010qaqz111 于 2013-4-1 00:44 发表
新的 EXEC --clone: 用法里面,--exe: 是必须的吗?这个 --exe 填其他非 pecmd.exe 的 exe 路径会是什么效果?


ENVI^    SET^   等于 ENVI   &&&  SET &&&,  这样  控制命令可以独立出来。

SET-def  等于  SET&  ENVI &&, 用于 定义本级PE变量。 这样定义PE变量可以独立出来。

这样可以减少 & 的使用。
ENVI^  FORCELOCAL=1
则可以不用 &

原来用法还可用。
回复

使用道具 举报

5109#
发表于 2013-4-1 09:44:04 | 只看该作者
SET-def 是起到声明到作用吗?

比如在文件级需要一个变量,但是用 SET XXX 是删除的语法,SET XXX= 是赋空值的语法,但是其实只是要说明这个变量处于该级别而并不需要改变它的值,这样在该文件被第二次以上 IMPORT 的时候就不会改变这些变量已有的值。

现在是用 FIND $XXX=,SET &XXX= 这样的方法作类似声明的功能的。
回复

使用道具 举报

5110#
发表于 2013-4-1 09:53:05 | 只看该作者
ENVI &&&FORCELOCAL=1
ENVI W9=2400000000
ENVI W10=130086851400000000
CALC W10=%W10%%%W9%
MESS %W10%

CALC 的%是取余吧,为什么CALC W10=%W10%%%W9%不能正常取余?
回复

使用道具 举报

5111#
发表于 2013-4-1 10:05:23 | 只看该作者
再次试了下CALC W10=%W10%% %W9%能取余
回复

使用道具 举报

5112#
 楼主| 发表于 2013-4-1 10:39:16 | 只看该作者
原帖由 2010qaqz111 于 2013-4-1 09:44 发表
SET-def 是起到声明到作用吗?
比如在文件级需要一个变量,但是用 SET XXX 是删除的语法,SET XXX= 是赋空值的语法,但是其实只是要说明这个变量处于该级别而并不需要改变它的值,这样在该文件被第二次以上 IMPORT 的时候就不会改变这些变量已有的值。
现在是用 FIND $XXX=,SET &XXX= 这样的方法作类似声明的功能的。


1: SET-def 是定义, 不仅仅是声明作用, 没有这个变量,就生成一个变量。

2: PE变量没有删除, 只能清空。  删除时系统自动进行的。  在退出当前范围时,自动销毁。
不支持手动删除的原因是, 安全考虑, 即 不容易犯逻辑错误。
     定义了一个&&A; 后面操作的A都是本级A; 再删除A, 但忘了; 再操作A, 此时修改的就是上级的A, 从而出现逻辑错误。
     所以禁止删除。 反正没有坏处。
回复

使用道具 举报

5113#
 楼主| 发表于 2013-4-1 10:42:34 | 只看该作者
原帖由 2011hwo1 于 2013-4-1 09:53 发表
ENVI &&&FORCELOCAL=1
ENVI W9=2400000000
ENVI W10=130086851400000000
CALC W10=%W10%%%W9%
MESS %W10%

CALC 的%是取余吧,为什么CALC W10=%W10%%%W9%不能正常取余?


取余 是整数运算。标准写法是:
CALC #W10=%W10%  %  %W9%
一堆的%的, 价格空格吧。

对 取余 整数运算, 没有#也可以。
对超大的整数,#还是必须的。 此时 (double) 浮点数精度不够。 结果是错的。 (和机器有关)。

130086851400000000 = 0x1CE294D57A56200
57个2进制位。
是超大数。 够呛。
这个数很碰巧, 才碰巧正确。   
加 1 就不同了。
  1. ENVI &&&FORCELOCAL=1
  2. ENVI W9=2400000000
  3. ENVI W10=130086851400000001
  4. CALC  W11=%W10%  %  %W9%
  5. CALC #W12=%W10%  %  %W9%
  6. MESS W11=%W11%  W12=%W12%
复制代码

结果W11=1800000000  W12=1800000001
不同了。


除法 有 # 就不同了。

[ 本帖最后由 mdyblog 于 2013-4-1 11:24 编辑 ]
回复

使用道具 举报

5114#
发表于 2013-4-1 11:02:48 | 只看该作者
CALC不加#计算是最多能保证前16位的数是正确的吧
回复

使用道具 举报

5115#
 楼主| 发表于 2013-4-1 11:08:29 | 只看该作者
原帖由 2011hwo1 于 2013-4-1 11:02 发表
CALC不加#计算是最多能保证前16位的数是正确的吧


大概是这个意思。
回复

使用道具 举报

5116#
发表于 2013-4-1 13:03:42 | 只看该作者
SET-def 会改变变量的值吗?如果之前这个变量已经存在并且有非空的值的情况下再遇到 SET-def 的话?
回复

使用道具 举报

5117#
 楼主| 发表于 2013-4-1 14:38:43 | 只看该作者
原帖由 2010qaqz111 于 2013-4-1 13:03 发表
SET-def 会改变变量的值吗?如果之前这个变量已经存在并且有非空的值的情况下再遇到 SET-def 的话?


会的。
SET-def  A=XXX
如果本级有, 就相当于 SET A=XXXX
   值变为XXX
如果本级没有, 新建一个,值设为XXXX
回复

使用道具 举报

5118#
发表于 2013-4-1 21:30:01 | 只看该作者
那看来还是用find+set了
回复

使用道具 举报

5119#
发表于 2013-4-2 13:07:46 | 只看该作者
LOGS 感觉太简陋了,能否稍微改进一下?加上时间戳和来源文件以及线程ID,各部分之间用一个字符分离,方便EXCEL导入成表格进行分析查错,尤其是多线的时候。

EXEC --clone 的时候最好也能继承 LOGS 开关的状态,LOG 文件开另外一个也行。
回复

使用道具 举报

5120#
 楼主| 发表于 2013-4-2 16:56:22 | 只看该作者
原帖由 2010qaqz111 于 2013-4-2 13:07 发表
LOGS 感觉太简陋了,能否稍微改进一下?加上时间戳和来源文件以及线程ID,各部分之间用一个字符分离,方便EXCEL导入成表格进行分析查错,尤其是多线的时候。

EXEC --clone 的时候最好也能继承 LOGS 开关的状 ...


PECMD2012.1.75.1-130314-30.多窗口线程孵化版_win32_64.sfx.zip

1: 线程ID\t高精度计时数\t[命令] 。。。

2: EXEC --clone  需要在 最开始加一条LOGS命令,来开启自己的LOGS
这个没法继承, 因为还需要指定新的 LOG文件的。

可以
LOGS *X.%__PID%.LOG



多线程 也可类似。
可以
@LOGS *X.%__TID%.LOG
//@是防止 打到 父线程LOG, 引起干扰。

[ 本帖最后由 mdyblog 于 2013-4-2 17:33 编辑 ]
回复

使用道具 举报

5121#
发表于 2013-4-2 19:02:07 | 只看该作者
原帖由 mdyblog 于 2013-4-2 16:56 发表
2: EXEC --clone  需要在 最开始加一条LOGS命令,来开启自己的LOGS
这个没法继承, 因为还需要指定新的 LOG文件的。

可以

LOGS *X.%__PID%.LOG



多线程 也可类似。

可以

@LOGS *X.%__TID%.LOG
//@是防止 打到 父线程LOG, 引起干扰。

那么给 --clone 增加一个 --logs 开关如何?让进程在 fork 的时候视为在 LOAD 的配置文件最开始插入了一条 LOGS 命令,这个参数不知是否可以从父进程传递到子进程,如果可以的话应该就没问题,因为 --logs 可能带上 %__PID% 之类的参数,在子进程里面这个值的解释和父进程会不一样。
因为一般使用 LOGS 做分析的时候都是希望一条命令就能够掌控整个过程的 LOG 是否产生(比如,类似 C++ 的 _DEBUG 预定义宏),如果在新 fork 进程的时候每个配置文件都要来一下的话会很麻烦,而且开多线有 LOGS 开多进程要新指定 LOGS 这样类似的操作但是行为有差异貌似也不是很好的风格。




我现在用的一个生成 LOG 来辅助分析的方法是这样:
TEAM {DATE &&CT uptime|CALC &&CT=%&CT%/1000##3|WRIT %Desktop%\PECMDLOG\%&CT%-PNET-IN,,}
放在配置文件头部,PNET-OUT 放在配置文件最末尾,在文件中间可能也会放置这样的命令,不过替换的红字不一样。

我是把同类型工作放到单独的 INI 文件里面,这些是为了记录进入和完成每一个工作需要的时间,对于特别耗时间的操作就把 LOAD 改为 THREAD* LOAD 或者 EXEC --clone 的方式执行。
实际上这种分析效果很不错,几次测试下来之前一个 PE 的启动进程我用多线程和多进程配合,把启动过程加快了 10 秒左右。这是在一个很老的单核单线机器上的效果,如果在新的机器上应该能够更快的。

我是比较习惯将不同的操作分开在不同的配置文件里面进行,因为这样方便选择是用多线程还是多进程,如果是用 _SUB 的话,多线程倒是可以,但是要开多进程来执行就稍稍有些不方便(目前好像也没有比较直接的手段可以将一个 _SUB 丢到新进程去执行)。

所以,我想建议给 LOAD 加载的配置文件各自自动产生一条类似:
线程ID\t高精度计数\t[进入/完成某配置文件]
这样的信息。

之前在说到 IMPORT 的处理机制的时候,我猜想在 PECMD 的脚本代码执行之前应该是对全部代码有过一次扫描的,这样如果在文件中部出现 LOGS 的话,就在该文件开始执行的时候加上一条 【进入该配置文件】的日志,然后正常运行到 LOGS 命令之后才开始按照 LOGS 的设置进行日志生成。

[ 本帖最后由 2010qaqz111 于 2013-4-2 19:03 编辑 ]
回复

使用道具 举报

5122#
 楼主| 发表于 2013-4-2 19:30:34 | 只看该作者
HELP 支持 (循环)模糊搜索文本。如图


HELP 支持模糊书签
   HELP CALCABC
   HELP CALXXX   都 对应  SWIN  


HELP 支持 模糊查询,直达某字符串
格式: HELP ~字符串[.]
.表示不表格对齐。
如:
HELP    ~命令群.

DATE   变量名 Counter
  返回 高精度计时

DATE 变量名 Freq
返回 高精度计时 的频率

DATE   变量名 子项1   子项2  子项3  子项4 ...     //可以多个子项

DATE &V Freq  Counter
MESS %&V%
// 2241044 441890012501

[ 本帖最后由 mdyblog 于 2013-4-2 22:49 编辑 ]
回复

使用道具 举报

5123#
 楼主| 发表于 2013-4-2 23:02:51 | 只看该作者
原帖由 2010qaqz111 于 2013-4-2 19:02 发表
那么给 --clone 增加一个 --logs 开关如何?让进程在 fork 的时候视为在 LOAD 的配置文件最开始插入了一条 LOGS 命令,这个参数不知是否可以从父进程传递到子进程,如果可以的话应该就没问题,因为 --logs 可 ...


克隆方式支持 --logs: 开关

EXEC --logs:?*y2.%__PID%.log  --clone:&CMD AA BB CC

? 为: 此时已打开LOGS 时, 才有效(即继承)。

进入脚本:

线程ID\t高精度计数\t[进入配置文件:文件名]

退出脚本:

线程ID\t高精度计数\t[完成配置文件:文件名]


好复杂啊。

  1. 1592 445896495093 [进入配置文件:D:\MDY\DESKTOP\Test\y2.WCS]
  2. 1592 445896497415 [LOGS *X.LOG] <0> :操作成功完成。
  3. 1592 445896497602 [ENVI &&&ENVIMODE=1] <0> :操作成功完成。
  4. 1592 445896497646 [ENVI &&&FORCELOCAL=1] <0> :操作成功完成。
  5. 1592 445896497667 [TEAM ENVI &&&ENVIMODE=1| ENVI &&&FORCELOCAL=1] <0> :操作成功完成。
  6. 1592 445896497714 [SET &CMD=MESS ----] <0> :操作成功完成。
  7. 1592 445896514782 [EXEC --logs:?*y2.4120.log  --clone:&CMD AA BB CC] <0> :操作成功完成。
  8. 1592 445896515042 [SET  ::WM_LBUTTONDOWN                  =0x0201] <0> :操作成功完成。
  9. 1592 445896521787 [ENVI @this.MSG=0x0201::wp,lp,MESS- HELLO wp=[],lp=[]@#OK] <0> :操作成功完成。
  10. 1592 445902060118 [WIN1] <0> :操作成功完成。
  11. 1592 445902064593 [完成配置文件:D:\MDY\DESKTOP\Test\y2.WCS]
  12. 1592 445902065915 [完成配置文件:]
复制代码
  1. 5968 446056559815 [进入配置文件:D:\MDY\DESKTOP\Test\*map:268:20]
  2. 5968 446056562136 [LOGS *y2.4120.log] <0> :操作成功完成。
  3. 5968 446058554371 [MESS ----] <0> :操作成功完成。
  4. 5968 446058555995 [完成配置文件:*map:268:20]
  5. 5968 446058557048 [完成配置文件:]
复制代码

[ 本帖最后由 mdyblog 于 2013-4-2 23:20 编辑 ]
回复

使用道具 举报

5124#
发表于 2013-4-2 23:23:07 | 只看该作者
线程ID\t高精度计数\t[命令信息]

这个“高精度计数”是返回的 QueryPerformanceCounter 的值还是时间?如果是 counter 值的话也许有些不直观,其实用 uptime 就很好。

复杂指?
如果是 LOGS 格式的话,那就除了原来只有[命令]的格式之外不规定任何格式吧,给一个自定义格式,像 sprintf 之类,自己选择线程ID uptime CurFile之类的组件自己拼去。

实现起来很复杂的话就算了,毕竟也有其他手段可以代替,这个功能的复杂化说到底也并不是必须的。
回复

使用道具 举报

5125#
发表于 2013-4-2 23:28:28 | 只看该作者
噢,你是说输出的日志看起来变复杂了。

这个其实不妨碍,毕竟做性能分析本来就涉及很复杂的数据阅读过程,不过这么看起来的话,要不就默认保持原来的格式不变,要更复杂的信息加开关自己组装输出格式,这样就符合 keep it simple 的原则了又能满足更复杂的需求。

复杂日志的分析一般都有一套专门的工具来做,像这样用制表或者其它字符分隔开的简易 LOG 因为有 EXCEL 这种现成工具可以利用,所以还算是性价比比较好的:)

[ 本帖最后由 2010qaqz111 于 2013-4-2 23:32 编辑 ]
回复

使用道具 举报

5126#
 楼主| 发表于 2013-4-2 23:31:41 | 只看该作者
原帖由 2010qaqz111 于 2013-4-2 23:28 发表
噢,你是说输出的日志看起来变复杂了。

这个其实不妨碍,毕竟做性能分析本来就涉及很复杂的数据阅读过程,不过这么看起来的话,要不就默认保持原来的格式不变,要更复杂的信息加开关自己组装输出格式,这样就 ...

不是。 是说 添加的程序代码、 改了好半天。
日志不复杂。 比程序简单多了, 比 脚本简单多了。
回复

使用道具 举报

5127#
 楼主| 发表于 2013-4-2 23:35:10 | 只看该作者
原帖由 2010qaqz111 于 2013-4-2 23:23 发表
线程ID\t高精度计数\t[命令信息]

这个“高精度计数”是返回的 QueryPerformanceCounter 的值还是时间?如果是 counter 值的话也许有些不直观,其实用 uptime 就很好。

复杂指?
如果是 LOGS 格式的话,那 ...

是 QueryPerformanceCounter。


uptime  精度不够。 我试过。 好多行的  uptime  都一样。
DATE  Freq  可以知道 其计数 频率。  
回复

使用道具 举报

5128#
发表于 2013-4-2 23:37:57 | 只看该作者
原帖由 mdyblog 于 2013-4-2 23:31 发表

不是。 是说 添加的程序代码、 改了好半天。
日志不复杂。 比程序简单多了, 比 脚本简单多了。

呵呵,辛苦了。
刚才我翻了下这个帖子前面的回复,从12年初一直坚持改进到现在,不容易啊。
我在坛子里也找过很多 PE,其中许多都是用的新版 PECMD 了,阁下的威力无处不在,哈哈。
回复

使用道具 举报

5129#
发表于 2013-4-2 23:42:45 | 只看该作者
原帖由 mdyblog 于 2013-4-2 23:35 发表

是 QueryPerformanceCounter。

uptime  精度不够。 我试过。 好多行的  uptime  都一样。
DATE  Freq  可以知道 其计数 频率。   

对的,我之前用 WRIT 写文件名的时候也是出现这个问题,而且因为是文件系统自己排序,很多顺序给颠倒了。所以如果能自己组装输出格式的话,我想 uptime.hpcounter这样的格式应该能够同时应付直观和精度两方面的问题。

又或者加上一个高精度的直观时间,以 PECMD 启动或者遇到 LOGS 命令算起,计算出一个高精度的时间来,毫秒微妙纳秒为单位都可以,小数点后的数据长度留够,格式化成统一长度。不过每行命令增加一次的除法运算不知道会不会对性能造成明显的负担。
回复

使用道具 举报

5130#
 楼主| 发表于 2013-4-3 00:56:52 | 只看该作者
原帖由 2010qaqz111 于 2013-4-2 23:42 发表

对的,我之前用 WRIT 写文件名的时候也是出现这个问题,而且因为是文件系统自己排序,很多顺序给颠倒了。所以如果能自己组装输出格式的话,我想 uptime.hpcounter这样的格式应该能够同时应付直观和精度两方面 ...


以纳秒 为单位。 (10^-9秒)再 带3位小数。

LOAD 开关(适用于 各种格式 : FILE 和 **MEM   ##内部脚本ID):
┃    │    │//开关 **logs:【*】log文件名]  //                                                             ┃
┃    │    │//开关 **Local  //Forcelocal=1模式                                                          ┃
┃    │    │//开关 **EnviMode  //EnviMode=1模式                                                         ┃


[ 本帖最后由 mdyblog 于 2013-4-3 08:53 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-7-13 14:08

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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