|
原帖由 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
|
|