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

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

   火... [复制链接]
发表于 2013-3-31 18:58:37 | 显示全部楼层
用 LOAD **mem &WCS 加载的码不认 IMPORT?

A.WCS
F1
IMPORT L1.WCS
LOGS * X.LOG
F

SET &B=MESS B
SET.< B=\nIMPORT L1.WCS
SET.< B=\nF
LOAD **mem &B

_SUB F1
MESS F1 in A
_END


L1.WCS
_SUB F
   MESS F from %CurFile%
_END


X.LOG
[LOGS * X.LOG]        <0>:操作成功完成。
[MESS F from D:\Tools\Script\PECMD\IMP.wcs\A.WCS]        <0>:操作成功完成。
[F]        <0>:操作成功完成。
[SET &B=MESS B]        <0>:操作成功完成。
[SET.< B=\nIMPORT L1.WCS]        <0>:操作成功完成。
[SET.< B=\nF]        <0>:操作成功完成。
[MESS B]        <0>:操作成功完成。
[IMPORT L1.WCS]        <2>:系统找不到指定的文件。
[F]        <2>:系统找不到指定的文件。
[LOAD **mem &B]        <0>:操作成功完成。
[LOGS ]        <0>:操作成功完成。
回复

使用道具 举报

 楼主| 发表于 2013-3-31 19:16:23 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 18:58 发表
用 LOAD **mem &WCS 加载的码不认 IMPORT?

不认。 只在 LOAD磁盘文件时认。

LOAD **mem 没有当前 文件目录, IMPORT L1.WCS 不知道到哪儿 去IMPORT 这个L1.WCS。 系统部稳定。
回复

使用道具 举报

 楼主| 发表于 2013-3-31 19:21:14 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 18:08 发表
IMPORT 是运行前执行,不支持 PE 变量解释路径,而且因为是运行前执行,被 IMPORT 的文件还没有 FILE=> 到位,难怪找到的文件版本不对,囧。

看来得另外想办法了。


如果 L1 仅仅定义了 _SUB 和一些文件 ...

动态执行, 分别加载文件 到变量, 再 合并为一个变量, 再执行这个变量。

设计方案 改改吧, 太复杂。
Keep It Simple !

[ 本帖最后由 mdyblog 于 2013-3-31 19:24 编辑 ]
回复

使用道具 举报

发表于 2013-3-31 19:26:35 | 显示全部楼层
SET.< B=\nIMPORT L1.WCS这个应该是全路径才行吧!
SET.<这种写法怎么在说明里没有
回复

使用道具 举报

发表于 2013-3-31 19:28:04 | 显示全部楼层
原帖由 <i>mdyblog</i> 于 2013-3-31 19:16 发表
不认。 只在 LOAD磁盘文件时认。

LOAD **mem 没有当前 文件目录, IMPORT L1.WCS 不知道到哪儿 去IMPORT 这个L1.WCS。 系统部稳定。


加了绝对路径也一样不行,还是报错 [IMPORT X:\WINDOWS\system32\L1.WCS] <2>:系统找不到指定的文件。
LOAD **mem 我以为是继承 运行这个 LOAD 命令的脚本的当前目录。

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

使用道具 举报

发表于 2013-3-31 19:45:39 | 显示全部楼层
原帖由 mdyblog 于 2013-3-31 19:21 发表

动态执行, 分别加载文件 到变量, 再 合并为一个变量, 再执行这个变量。

设计方案 改改吧, 太复杂。
Keep It Simple !

设计方案不复杂的,L1里面是2个要使用很多次的 _SUB,避免每个要用到它的配置里都来上一份,所以才想到用 IMPORT 做就地展开。

需要 IMPORT 的配置文件放在 UD 扩展区里面,如果从 UD 导出到磁盘一个是可能会产生多线程同步的问题,另外一个就是写磁盘会造成性能的影响(虽然比较微小,但是在多线程多进程都写磁盘的情况下影响很明显,尤其是在单核单线的老 CPU 上),所以 UD 里的文件都是采用 GETF# 读到内存用 LOAD **mem 加载,以期望获得跟在磁盘加载运行一样的效果。

不过既然 LOAD **mem 没有 %CurDir% 之类的变量和不支持 IMPORT,LOAD **mem 就只能成为一种有限制的机制来考虑要被 **mem 加载的文件了。

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

使用道具 举报

发表于 2013-3-31 19:47:00 | 显示全部楼层
原帖由 2011hwo1 于 2013-3-31 19:26 发表
SET.< B=\nIMPORT L1.WCS这个应该是全路径才行吧!
SET.

SET 后面的.是转换 \n 转义到实际的换行符;<在原内容后面追加。
回复

使用道具 举报

 楼主| 发表于 2013-3-31 20:14:48 | 显示全部楼层
原帖由 2011hwo1 于 2013-3-31 19:26 发表
SET.< B=\nIMPORT L1.WCS这个应该是全路径才行吧!
SET.


┃    │格式│ENVI[.$#%~~.*=<>] [&[&]][$][#][名称][=值]                                                   ┃
┃    │    │ENVI[.$#%~~.*=<>] &::[名称][=值]   //全局PE变量                                           ┃
┃    │    │。<>针对PE变量,<为在后面追加,>为在前面插入。                                            ┃
回复

使用道具 举报

 楼主| 发表于 2013-3-31 20:21:36 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 19:28 发表


加了绝对路径也一样不行,还是报错  :系统找不到指定的文件。
LOAD **mem 我以为是继承 运行这个 LOAD 命令的脚本的当前目录。


不是这么用的。
假设执行的代码为:
  1. MESS 1111
  2. IMPORT %CurDir%\AA\L1.WCS
  3. MESS 3333
复制代码


TEAM  ENVI  &&&ForceLocal=1| ENVI &&&EnviMode=1

SET$  &NL=0d 0a
SET  &V1=MESS 1111%&NL%
加载 %CurDir%\AA\L1.WCS 到变量  &&V2
SET  &V3=%NL%MESS 3333%NL%
SET<   V1=V2   //加入 V2
SET<   V1=V3   //加入 V3

LOAD **mem  &V1  1 2 3
回复

使用道具 举报

发表于 2013-3-31 20:33:35 | 显示全部楼层
这个意思是差不多是自己手动来完成 IMPORT 的功能吧,倒是也算一个解决方案,可以用 SED 处理配置文件里面的 IMPORT 语句,而且应该可以在 IMPORT 里用 PE 变量解释路径了,我试试看。

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

使用道具 举报

 楼主| 发表于 2013-3-31 21:02:11 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 20:33 发表
这个意思是差不多是自己手动来完成 IMPORT 的功能吧,倒是也算一个解决方案,可以用 SED 处理配置文件里面的 IMPORT 语句,而且应该可以在 IMPORT 里用 PE 变量解释路径了,我试试看。


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


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


[ 本帖最后由 mdyblog 于 2013-3-31 21:15 编辑 ]
回复

使用道具 举报

发表于 2013-3-31 21:02:35 | 显示全部楼层
CODE **-BOM,&L1,**-,&&L2

说明里写 -BOM 可以指定给源格式,但是这命令 -BOM 不能识别 UTF8+BOM 的格式转换出正确的结果呢?

[CODE **-BOM,&L1,**-,&&L2]        <2147942487>:参数错误。
回复

使用道具 举报

发表于 2013-3-31 21:18:05 | 显示全部楼层
原帖由 mdyblog 于 2013-3-31 21:02 发表


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


如果让 LOAD **mem 和 LOAD 磁盘文件一样的话,可以考虑这样的规则:

在【LOAD **mem &变量名】运行的代码里面:
%CurDir%:直接返回调用者的 %CurDir%,或者返回字串 **mem "调用者文件A的%CurDir%的返回"
%CurFile%:直接返回调用者的 %CurFile%,或者返回字串 **mem &变量名 "调用者文件A的%CurFile%的返回"

比如,在文件 C:\temp\A.wcs 中加载 L1.wcs 到变量LC后 LOAD **mem:
L1.wcs
MESS %CurDir%\n%CurFile%

C:\temp\A.wcs
GETF# L1.wcs,0#*,&&LC
LOAD **mem &LC

返回显示:
**mem "C:\temp"
**mem &LC "C:\temp\a.wcs"

**mem代码的返回用空格分隔各个部分,这样方便 MSTR 和 LPOS*** 直接进行处理。

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

使用道具 举报

 楼主| 发表于 2013-3-31 21:18:56 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 21:02 发表
CODE **-BOM,&L1,**-,&&L2

说明里写 -BOM 可以指定给源格式,但是这命令 -BOM 不能识别 UTF8+BOM 的格式转换出正确的结果呢?

        :参数错误。

这个是给 文件转换用的。  
我再看看 。
回复

使用道具 举报

 楼主| 发表于 2013-3-31 21:26:07 | 显示全部楼层
原帖由 2010qaqz111 于 2013-3-31 21:18 发表


如果让 LOAD **mem 和 LOAD 磁盘文件一样的话,可以考虑这样的规则:

在【LOAD **mem &变量名】运行的代码里面:
%CurDir%:直接返回调用者的 %CurDir%,或者返回字串 **mem "调用者文件A的%CurDir%的返 ...

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

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

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

使用道具 举报

发表于 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的结果不可预期,还是只支持系统环境变量和内置固定变量就好,这样应该也是足够用的了,更复杂的要求应该也可以通过其他方式完成,不需要以增加代码不可预期性为代价来满足那种需求。
回复

使用道具 举报

发表于 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 编辑 ]
回复

使用道具 举报

 楼主| 发表于 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 才有效。
回复

使用道具 举报

发表于 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】  ...

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

使用道具 举报

 楼主| 发表于 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
复制代码
回复

使用道具 举报

发表于 2013-4-1 00:44:13 | 显示全部楼层
新的 EXEC --clone: 用法里面,--exe: 是必须的吗?这个 --exe 填其他非 pecmd.exe 的 exe 路径会是什么效果?
回复

使用道具 举报

 楼主| 发表于 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 编辑 ]
回复

使用道具 举报

 楼主| 发表于 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
则可以不用 &

原来用法还可用。
回复

使用道具 举报

发表于 2013-4-1 09:44:04 | 显示全部楼层
SET-def 是起到声明到作用吗?

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

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

使用道具 举报

发表于 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%不能正常取余?
回复

使用道具 举报

发表于 2013-4-1 10:05:23 | 显示全部楼层
再次试了下CALC W10=%W10%% %W9%能取余
回复

使用道具 举报

 楼主| 发表于 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, 从而出现逻辑错误。
     所以禁止删除。 反正没有坏处。
回复

使用道具 举报

 楼主| 发表于 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 编辑 ]
回复

使用道具 举报

发表于 2013-4-1 11:02:48 | 显示全部楼层
CALC不加#计算是最多能保证前16位的数是正确的吧
回复

使用道具 举报

 楼主| 发表于 2013-4-1 11:08:29 | 显示全部楼层
原帖由 2011hwo1 于 2013-4-1 11:02 发表
CALC不加#计算是最多能保证前16位的数是正确的吧


大概是这个意思。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-9-10 23:14

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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