|  | 
| 原帖由 hhh333 于 2009-12-22 13:53 发表  chenall真是编程高手,以前总想去递规调用,而兄弟就是一个dir /s就搞定了,很巧,逻辑也很清晰。怪不得现在不点将g4d也交到你手上了。
 
 有个建议,由于有的PE会将TEMP改变到硬盘或其他盘上,在这上面读写效率 ...
 PECMD-32.2012.1除夕版.多窗口多线-U65F裸机系统+18M酷MiniPE
 http://bbs.wuyou.net/forum.php?mod=viewthread&tid=205402&extra=page%3D1
 
 直接在内存中生成,不需要中间临时文件。
 PETOOLS_LINK.WCS:
 #!PECMD
 // VER >= PECMD2012.1.U65F
 SET &&EnviMode=1  //避免意外错误,空变量,外部变量,
 SET FORCELOCAL=1  //可以处理大变量. 不影响外部变量
 ///////LOGS *D:\xx.log //调试记录
 CALL PETOOLS_LINK %*
 //主函数: PETOOLS_LINK
 //参数: 搜索处理的目录
 //     可以是相对目录, .. . 构成的目录
 _SUB PETOOLS_LINK
 FIND  $=%StartMenu%, EXIT _SUB
 FIND  $=%~1, EXIT _SUB
 SET &SETUP=   //初始化空表
 TEAM SET &SETUP=| SET &LST=| SET ®=|  SET &INF=| SET &BLEN=0|  SET &BASE_DIR=
 SET$ &NL=0d 0a //换行
 
 
 FDIR --full BASE_DIR=%1\    //换成绝对,干净的路径
 
 STRL BLEN=%BASE_DIR%
 CALC BLEN=%BLEN% + 2  // 1:\  1:下一位置
 LSTR DRV=1,%BASE_DIR%  //D
 SET 外置程序=%StartMenu%\外置程序_%DRV%盘
 
 FILE  %外置程序%
 
 EXEC* --wd:"%~1" LST=!cmd /c dir /s/a/b *.wim *.cmd *.bat *.exe *.wcs *.wcz  readme*.txt 使用说明*.txt
 TEAM SET I=1| READ -,-1,NUM,%LST%
 LOOP #%I%<=%NUM%,
 {
 READ -,%I%,LINE,%LST%
 CALC  I=%I% + 1
 CALL  MAKE_LINK "%LINE%"  //带有目录
 }
 CALL  merge "%外置程序%"
 EXEC* --wd:"%~1" REG=!cmd /c dir /s/a/b SETUP_REG.REG 2>nul
 TEAM SET I=1| READ -,-1,NUM,%REG%
 LOOP #%I%<=%NUM%,
 {
 READ -,%I%,LINE,%REG%
 CALC  I=%I% + 1
 EXEC =REGEDIT /S %LINE%   //带有目录
 }
 EXEC* --wd:"%~1" INF=!cmd /c dir /s/a/b setup.inf 2>nul
 TEAM SET I=1| READ -,-1,NUM,%INF%
 LOOP #%I%<=%NUM%,
 {
 TEAM READ -,%I%,LINE,%INF%| CALC  I=%I% + 1
 EXEC =RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 %LINE%  //带有目录
 //DEVI %LINE%  //直接用DEVI
 }
 
 TEAM SET I=1| READ -,-1,NUM,%SETUP%
 LOOP #%I%<=%NUM%,
 {
 TEAM READ -,%I%,LINE,%SETUP%| CALC  I=%I% + 1
 EXEC --wd:*"%LINE%"   !%LINE%
 }
 _END//END_OF_PETOOLS_LINK
 
 _SUB MAKE_LINK
 FIND $=%~1, EXIT _SUB
 TEAM SET &&MN=|  SET &&PT=
 NAME MN=%~1
 FIND $=%MN%, EXIT _SUB
 FIND $setup=%MN%,
 {
 SET SETUP=%SETUP%%NL%%1  //加入SETUP表
 EXIT _SUB
 }
 FDIR DIR1=%~1
 MSTR PT=%BLEN%,-1,%DIR1%  //砍掉起始目录BASE_DIR\
 ECHO MN=[%PT%] [%PT%\%MN%]
 LINK %外置程序%\%PT%\%MN%,%~1
 _END // END_OF_MAKE_LINK
 //:PETOOLS_SETUP //这个版本PECMD 可以 --wd:dir 解决
 
 // merge: 对每个子目录, CALL  merge_lnk
 _SUB merge
 SET &I=   //
 FORX  @%~1\*.*,I, CALL  merge_lnk  "%I%"
 _END // END_OF_merge
 
 
 // merge_lnk: 一个或空目录,合并到上级目录
 _SUB merge_lnk
 TEAM SET &I=   //
 FORX @%~1\*.*,I, CALL  merge_lnk  "%I%"  //递归调用,深度优先。
 TEAM SET &MN=| SET &n=0| SET &MSG=| SET &NUM=| SET &FILE=| SET &DIR=%~1| SET &LINE=
 FORX %~1\*.*,I,
 {
 NAME MN=%I%
 IFEX ..\%MN%, SET n=9| CALC n=%n% + 1   //上级有重名则不移动
 }
 FIND $%n%>1,! // EXIT _SUB   //多个文件
 {
 EXEC* MSG=!cmd.exe  /C  dir /a/b %~1\*.*    //没有目录名;
 READ -,-1,NUM,%MSG%
 LOOP #%I%<=%NUM%,
 {
 TEAM READ -,%I%,LINE,%MSG%| CALC  I=%I% + 1
 IFEX %DIR%\%LINE%,! FILE  %FILE%->%DIR%\..   //移动到上级
 }
 EXEC* MSG=!cmd.exe  /C  dir /a/b %~1\*.*   //没有目录名;
 READ -,-1,NUM,%MSG%
 IFEX $%NUM%<1, FILE %~1 //删除空目录
 }
 _END  //END_OF_merge_lnk
 _ENDFILE  //_ENDFILE 后面部分根本不调入内存,就像不存在
 EXIT FILE
 //<2>PETOOLS.WCS: DSystem mdyblog.blog.163.com
 //调用方式
 //PETOOLS_LNK [PETOOLS目录]
 //PECMD调用例子,查找所有petools目录。
 //FORX @\PETOOLS,TOOLS,0,PECMD LOAD PETOOLS_LINK.WCS  "%TOOLS%” //外部脚本
 //FORX @\PETOOLS,TOOLS,0,CALL PETOOLS_LINK  "%TOOLS%"            //嵌入函数 ,直接调函数
 //<1>PETOOLS.CMD: chenall
 ::petools扩展目录搜索安装程序 by chenall [url=http://www.chenall.comhttp://www.chenall.com[/color[/url]]
 ::思路来源:[url=http://bbs.wuyou.net/forum.php?mod=viewthread&tid=140951http://bbs.wuyou.net/forum.php?mod=viewthread&tid=140951[/color[/url]]
 ::调用方式
 ::PETOOLS_LNK [PETOOLS目录]
 ::PECMD调用例子,查找所有petools目录。
 ::PECMD FORX @\PETOOLS,TOOLS,0,!EXEC CMD /C “PETOOLS_LINK %TOOLS%”
 ::2009-12-22 第三版,2009-12-23,修改了执行SETUP.BAT/CMD的调用方式为START /W,解决碰到EXIT退出的问题.
 ::2009-12-23,对于注册表文件只自动注册setup_reg.reg,其它的可以由setup.cmd来调用.以免重复执行
 ::具体无忧专贴:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=158014
 
 
 
 
 
 | 
 |