无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
楼主: chenall
打印 上一主题 下一主题

发一个重新写的petools搜索配置(第三版,修正)

  [复制链接]
1#
发表于 2012-3-3 03:11:05 | 显示全部楼层
原帖由 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 &REG=|  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





回复

使用道具 举报

2#
发表于 2012-3-3 10:51:57 | 显示全部楼层
原帖由 2012abc19701 于 2012-3-3 03:11 发表


PECMD-32.2012.1除夕版.多窗口多线-U65F裸机系统+18M酷MiniPE
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=205402&extra=page%3D1

直接在内存中生成,不需要中间临时文件。
PETOOLS_LINK.WCS:
#!PECMD ...

简化了一下:


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=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
    FORX *NL LST,LINE, CALL  MAKE_LINK "%LINE%"  //带有目录

    CALL  merge "%外置程序%"

    EXEC* --wd:"%~1" REG=!cmd /c dir /s/a/b SETUP_REG.REG 2>nul
    FORX *NL REG,LINE, EXEC REGEDIT /S %LINE%   //带有目录
    EXEC* --wd:"%~1" INF=!cmd /c dir /s/a/b setup.inf 2>nul
    FORX *NL INF,LINE, EXEC =RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 %LINE%  //带有目录
        //DEVI %LINE%  //直接用DEVI
   
    FORX *NL SETUP,LINE, 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%, TEAM  SET SETUP=%SETUP%%NL%%1 | EXIT _SUB //加入SETUP表
    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,! // !多个文件
    {
        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/viewthread.php?tid=140951http://bbs.wuyou.net/viewthread.php?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



[ 本帖最后由 2012abc19701 于 2012-5-5 08:41 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-21 19:56

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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