无忧启动论坛

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

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

    [复制链接]
5071#
 楼主| 发表于 2013-3-31 08:37:16 | 只看该作者
原帖由 clonecd 于 2013-3-31 07:59 发表
搭车问一下,如果我要导出的不是脚本文件,而是一个2到3MB的东西,用PUTF -dd怎么导出,就举前面讲过的例子。PUTF -dd类似linux里的,不过看得不是很明白。给个例子吧。
比如 ud 区对应的磁盘用 fbinst --list 看到的序号是 (hd1),fbinst (hd1) info 输出的目录项:
1e "MINIPE/BOOT.INI" 0x9055 282 (2013-03-23 12:29:35)





PUTF -dd -bs=10M   -len=282  -skipb=0x9055S  -quick    D:\boot.ini,0,\\.\PhysicalDrive1

// -bs=10M  为10M高速缓冲;
// -len=282  为文件长度;   
// -skipb=0x9055S 为输入数据在磁盘上的位置
回复

使用道具 举报

5072#
 楼主| 发表于 2013-3-31 08:41:51 | 只看该作者
原帖由 gggaoshan 于 2013-3-31 08:27 发表
请问大师

   如何将有驱动加载并需要重新启动机器的软件安装到WinPE中, 比如说像防火墙之类或Process Guard之类的软件如何安装到WinPE中。



这个慢慢调试了。
先手动安装一次。
不重启, 将文件部署 和注册表部署信息记录下来。
在PE启动前, 恢复这些部署。恢复的时机越早,越可靠。
再调调。

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

使用道具 举报

5073#
 楼主| 发表于 2013-3-31 09:01:23 | 只看该作者
更正: --clone:方式 应该如下,不加占位参数。 后面直接为脚本参数。

SET &Cmd=MESS 【%%*】 @ #OK //脚本存入PE变量&cmd中,支持多行

//还可以这样 多进程方式
EXEC --clone:&Cmd --exe:"%MyName%" 1 2 3 4 5 6 //--clone:方式 执行, 可以带参数。 这是多进程方式
//结果【1 2 3 4 5】

回复

使用道具 举报

5074#
 楼主| 发表于 2013-3-31 09:30:31 | 只看该作者
PECMD2012.1.75.1-130314-24.多窗口线程孵化版_win32_64.sfx.zip
THREAD$  
$后缀: 创建线程前,提前解释一次。
这样可以用%* %@ %1 %2  。。。
还可以减少 THREAD* 犯一种错误的可能性: 变量异步冲突 的逻辑错误。
注意, 线程运行时还要解释的一次。


变量异步冲突 示例:
TEAM ENVI &&&FORCELOCAL=1| ENVI &&&EnviMode=1
_SUB WIN1, W100H100
  SET &I=1
  LOOP %I%<5,
  {
     SET &J=%I%
     THREAD*   MESS I=%&I%  J=%J%
     CALC I=%I% + 1
  }
_END

会发现 I J 的值可能不同。有时同,有时不同, 随机的。换成[THREAD* TEAM WAIT 100|MESS I=%&I% J=%J%]则一定不同。
这就是 变量异步冲突 的逻辑错误。
I 时共享变量,  子线程和父线程 共享。(在持久栈,如窗口,上定义的PE变量均为共享变量)
子线程解释I时, 父线程 已经修改了该值, 逻辑错误。
J是局部变量, 子线程会自动复制自己的一份。 不冲突。

解决1(标准方法):
用局部变量传递
{
SET &J=%I%
SET &I2=%I%
THREAD* MESS I=%&I2% J=%J%
CALC I=%I% + 1
}


解决2(简洁方法):
用THREAD$
{
SET &J=%I%
THREAD*$  MESS I=%&I% J=%J%
CALC I=%I% + 1
}

此时提前解释了, 对线程了说,%I% 已换成了 实际值.
可能等价:
THREAD*$ MESS I=1 J=1


THREAD不带*时, 共享变量不共享, 也会拷贝, 没问题。 但全局变量还是共享的。

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

使用道具 举报

5075#
发表于 2013-3-31 09:45:35 | 只看该作者
GETF# 读出的东西直接用 LOAD **mem 加载好像有问题,日志里面不时就会出现一些命令中间多一个问号出来的情况,或者一个文件读不全,最后少了几字节,比如这样的日志条目:

[_SU?B FUNC1]

然后在调用 FUNC1 的地方就是这样的日志:
[FUNC1 V1 V2 V3]:<2> 系统找不到指定的文件。
回复

使用道具 举报

5076#
 楼主| 发表于 2013-3-31 10:00:47 | 只看该作者
原帖由 2010qaqz111 于 2013-3-31 09:45 发表
GETF# 读出的东西直接用 LOAD **mem 加载好像有问题,日志里面不时就会出现一些命令中间多一个问号出来的情况,或者一个文件读不全,最后少了几字节,比如这样的日志条目:

[_SU?B FUNC1]

然后在调用 FUN ...

这个文件 不在UD扩展区的原因, 此时文件不连续。 中间不时冒出个垃圾字符,是UD加的控制字符。
回复

使用道具 举报

5077#
 楼主| 发表于 2013-3-31 10:04:07 | 只看该作者
原帖由 2010qaqz111 于 2013-3-31 09:45 发表
GETF# 读出的东西直接用 LOAD **mem 加载好像有问题,日志里面不时就会出现一些命令中间多一个问号出来的情况,或者一个文件读不全,最后少了几字节,比如这样的日志条目:

[_SU?B FUNC1]

然后在调用 FUN ...

用FBINST 将文件移到扩展区吧。
或:

这样的还是用 Fbinst load 吧。

你改改逻辑。
UPLOAD 文件 改在子线程中。

_SUB ThreadUpLoadLoad
  // FBINST UPload to D:\AA.INI
  LOAD  D:\AA.INI  AAA BB CC
_END

或FBINST CAT
_SUB ThreadUpLoadLoad
  // FBINST CAT  to  &&binData  
  LOAD **mem  &binData   AAA BB CC
_END

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

使用道具 举报

5078#
发表于 2013-3-31 10:08:04 | 只看该作者
是不在扩展区的原因?
我比对了源文件发现这个问号大概是每512字节出现一次,我移到扩展区试试。
回复

使用道具 举报

5079#
 楼主| 发表于 2013-3-31 10:10:22 | 只看该作者
原帖由 2010qaqz111 于 2013-3-31 10:08 发表
是不在扩展区的原因?
我比对了源文件发现这个问号大概是每512字节出现一次,我移到扩展区试试。

对头                       
回复

使用道具 举报

5080#
发表于 2013-3-31 10:24:50 | 只看该作者
移到扩展区没问题了。不过不明白为毛弄个主区和扩展区的区别出来?主区那个控制字节又是啥?


IMPORT 的防止重入是否在第二次IMPORT同一个文件的时候就会在LOG里返回 <2>系统找不到指定文件?
回复

使用道具 举报

5081#
 楼主| 发表于 2013-3-31 10:42:44 | 只看该作者
原帖由 2010qaqz111 于 2013-3-31 10:24 发表
移到扩展区没问题了。不过不明白为毛弄个主区和扩展区的区别出来?主区那个控制字节又是啥?


IMPORT 的防止重入是否在第二次IMPORT同一个文件的时候就会在LOG里返回 系统找不到指定文件?

可能是早期版本,用这个吧。 后来这种格式还留下来了。 现在FBINT应该默认都放到扩展区,修改时不改变在那个区。
分成2种区, 为了区分启动信息和数据。 启动信息文件一般放到前面主区,一般不变了,这样保护启动信息。UD的菜单只能在主区,移不出来。
  
主区那个控制字节 是链接信息。 一块一块的链接起来,组成一个文件。

IMPORT 的确有 “防止重入”功能。
不返回任何信息。 直接丢弃。因为不在 执行时处理的。
回复

使用道具 举报

5082#
发表于 2013-3-31 10:46:37 | 只看该作者
现在遇到这样的情况:

文件 L1 定义了2个_SUB

文件 A IMPORT 了 L1,可以调用 L1 定义的 _SUB
文件 A LOAD 文件 B,文件 B 需要用 L1 定义的 _SUB,但是它不能继承 A IMPORT 来的内容
文件 B 自己 IMPORT L1,调用 L1 定义的 _SUB,LOG返回 <2>系统找不到指定的文件

这种情况应该怎么办?
回复

使用道具 举报

5083#
 楼主| 发表于 2013-3-31 11:04:00 | 只看该作者
原帖由 2010qaqz111 于 2013-3-31 10:46 发表
现在遇到这样的情况:

文件 L1 定义了2个_SUB

文件 A IMPORT 了 L1,可以调用 L1 定义的 _SUB
文件 A LOAD 文件 B,文件 B 需要用 L1 定义的 _SUB,但是它不能继承 A IMPORT 来的内容
文件 B 自己 IMPO ...


文件 B 自己 IMPORT L1】这样可以的。 是不是 不在一个目录啊。 这样需要全路径。
附件输出:
F  from D:\MDY\DESKTOP\Test\IMP\A.WCS
F  from D:\MDY\DESKTOP\Test\IMP\B.WCS

分别别是 A.WCS 中的L1.WCS  B.WCS中的L1.WCS运行的结果。
%CurFile% 为IMPORT 他的文件。

IMPORT 不跨 LOAD。

  1. [LOGS * X.LOG] <0>:操作成功完成。
  2. [MESS F  from D:\MDY\DESKTOP\Test\IMP\A.WCS] <0>:操作成功完成。
  3. [F] <0>:操作成功完成。
  4. [MESS F  from D:\MDY\DESKTOP\Test\IMP\B.WCS] <0>:操作成功完成。
  5. [F] <0>:操作成功完成。
  6. [LOAD B.WCS] <0>:操作成功完成。
  7. [LOGS ] <0>:操作成功完成。
复制代码


[ 本帖最后由 mdyblog 于 2013-3-31 11:20 编辑 ]

IMP.wcs.zip

620 Bytes, 下载次数: 7, 下载积分: 无忧币 -2

回复

使用道具 举报

5084#
发表于 2013-3-31 17:48:21 | 只看该作者
是带的全路径,Import 的路径支持变量解释么?比如这样:

SET &WS=%windir%\system32
IMPORT %&WD%\L1.wcs
回复

使用道具 举报

5085#
发表于 2013-3-31 18:08:56 | 只看该作者
IMPORT 是运行前执行,不支持 PE 变量解释路径,而且因为是运行前执行,被 IMPORT 的文件还没有 FILE=> 到位,难怪找到的文件版本不对,囧。

看来得另外想办法了。


如果 L1 仅仅定义了 _SUB 和一些文件级的 SET &,在 A 里面用 LOAD 加载 L1 完成之后也不能调用 L1 里面的 _SUB,这麻烦了。

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

使用道具 举报

5086#
发表于 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>:操作成功完成。
回复

使用道具 举报

5087#
 楼主| 发表于 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。 系统部稳定。
回复

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

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

使用道具 举报

5092#
发表于 2013-3-31 19:47:00 | 只看该作者
原帖由 2011hwo1 于 2013-3-31 19:26 发表
SET.< B=\nIMPORT L1.WCS这个应该是全路径才行吧!
SET.

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

使用道具 举报

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


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

使用道具 举报

5094#
 楼主| 发表于 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
回复

使用道具 举报

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

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

使用道具 举报

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

使用道具 举报

5097#
发表于 2013-3-31 21:02:35 | 只看该作者
CODE **-BOM,&L1,**-,&&L2

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

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

使用道具 举报

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

使用道具 举报

5099#
 楼主| 发表于 2013-3-31 21:18:56 | 只看该作者
原帖由 2010qaqz111 于 2013-3-31 21:02 发表
CODE **-BOM,&L1,**-,&&L2

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

        :参数错误。

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

使用道具 举报

5100#
 楼主| 发表于 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
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2025-7-27 08:43

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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