#!PECMD
// VER >= PECMD2012.1.U65F
//LOGS *X.log //调试记录
CALL PETOOLS_LINK %*

//主函数: PETOOLS_LINK
//参数:  PETOOLS_LINK [**allab|**all] 搜索处理的目录
//      可以是相对目录， .. . 构成的目录
// **allab 所有分区，跳过软盘A: B:。此时目录不带盘符
// **all   所有分区。此时目录不带盘符
_SUB PETOOLS_LINK,*
    FIND $**allab=%1,!!  FIND $X=X%2,! TEAM CALL PETOOLS_LINK_ALLAB %2 | EXIT
    FIND $**all=%1,!!    FIND $X=X%2,! TEAM CALL PETOOLS_LINK_ALL %2   | EXIT
    CALL PETOOLS_LINK1 %*
_END
_SUB PETOOLS_LINK1
//MESS <DEBUG> PETOOLS_LINK1－－【%*】
    ENVI^ EnviMode=1  //避免意外错误，空变量，外部变量，
    ENVI^ ForceLocal=0
    ENVI &_StartMenu=%StartMenu%
    ENVI$ &&NL=0a  //换行
    FIND  $ = %&_StartMenu%, EXIT _SUB
    FIND  $ = %~1, EXIT _SUB
    IFEX %~1\,!  EXIT 
    ENVI &&SETUP=   //初始化空表
    TEAM ENVI &&BLEN=0|  ENVI &&BDIR=
    
    FDIR --full &&BDIR=%~1\dummy    //换成绝对，干净的绝对路径, 没有引号, 后不加\
    STRL &&BLEN=%&BDIR%
    CALC &&BLEN=%&BLEN% + 2  // D:\PETOOLS\XXXXX\YYYY  D:\PETOOLS\下一位置
    LSTR &&DRV=1,%&BDIR%  //D
    ENVI &&外置程序=%&_StartMenu%\外置程序_%&DRV%盘
    
    FILE %&外置程序%
    
    THREAD* FORX /S %&BDIR%\SETUP_REG.REG,&&LINE,0, EXEC REGEDIT /S %&LINE%   //带有目录
    THREAD* FORX /S %&BDIR%\setup.inf,&&LINE,0, EXEC --wd:*"%&LINE%" =RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 %&LINE%  //带有目录

    EXEC* --wd:"%&BDIR%\" &&LST=!cmd /c dir /s/a/b *.wim *.cmd *.bat *.exe *.wcs *.wcz  readme*.txt 使用说明*.txt
    FORX *NL &&LST,&&LINE, CALL  MAKE_LINK "%&LINE%"  //带有目录
    ENVI &&=DEBUG &LST=[%&LST%]

    THREAD* CALL  merge "%&外置程序%"

        //DEVI $%&LINE%  //直接用DEVI
    
    MSTR &SETUP=2,-1,%&SETUP%  //跳过开始的换行
    FORX *NL &SETUP,&&LINE, EXEC --wd:*"%&LINE%"   !%&LINE%
_END  //END_OF_PETOOLS_LINK


_SUB MAKE_LINK
    FIND $ = %~1, EXIT _SUB
    TEAM ENVI &&MN=|  ENVI &&PT=
    NAME -ext &&MN=%~1
    FIND $ = %&MN%, EXIT _SUB
    ENVI  &&bsetup=0
    FIND $setup.exe = %&MN%, ENVI  &&bsetup=1
    FIND $setup.bat = %&MN%, ENVI  &&bsetup=1
    FIND $setup.cmd = %&MN%, ENVI  &&bsetup=1
    FIND $0 = %&bsetup%,! TEAM  ENVI &SETUP=%&SETUP%%&NL%%1 | EXIT _SUB  //加入SETUP表
    FDIR &&DIR1=%~1
    MSTR &&PT=%&BLEN%,-1,%&DIR1%  //砍掉起始目录BASE_DIR\
    LINK %&外置程序%\%&PT%\%&MN%,%~1
_END // END_OF_MAKE_LINK

// merge: 对每个子目录, CALL  merge_lnk
_SUB merge
    FORX  @%~1\*.*,&&I,0, CALL  merge_lnk  "%&I%"
_END // END_OF_merge


// merge_lnk: 一个或空目录，合并到上级目录
_SUB merge_lnk
    FORX @%~1\*.*,&&I,0, CALL  merge_lnk  "%&I%"  //递归调用,深度优先。
    TEAM ENVI &&n=0| ENVI &&NUM=0| ENVI &&DIR1=%~1
    FORX %~1\*.*,&&I,0,
    {
        NAME -ext &&MN=%&I%    
        IFEX %~1\..\%&MN%, ENVI &n=9! CALC #&n=%&n% + 1   //上级有重名则不移动
        IFEX $%&n% > 1, EXIT  _SUB  // 多个文件
    }
    FORX  %~1\*.*,&&afile,0,  FILE  %&afile%->%&DIR1%\..   //移动到上级
    FORX $%~1\*.*,&&afile,0,  CALC  &NUM=%&NUM% + 1
    IFEX $%&NUM%<1, FILE %~1 //删除空目录
_END  //END_OF_merge_lnk

//跳过 A: B: 软盘 
//PETOOLS_LINK_ALLAB PETOOLS
_SUB PETOOLS_LINK_ALLAB
    ENVI^ EnviMode=1  //避免意外错误，空变量，外部变量，
    ENVI &&Dir1=%~1
    FDRV &&ALLD=*:
    FORX * %&ALLD%,&&D,
    {
        FORM -raw &&TP=%&D%
        FIND $A:**DRIVE_REMOVABLE=%&D%**%&TP%, EXIT -  //continue 软盘A: 
        FIND $B:**DRIVE_REMOVABLE=%&D%**%&TP%, EXIT -  //continue 软盘B: 
        IFEX %&D%\%&Dir1%\,!  EXIT  -  //continue
        TEAM ENVI &&F=%&D%| THREAD* CALL  PETOOLS_LINK1 "%&F%\%&Dir1%"
    }
_END

//PETOOLS_LINK_ALL PETOOLS
_SUB PETOOLS_LINK_ALL
    ENVI^ EnviMode=1  //避免意外错误，空变量，外部变量，
    { FORX @\%~1,&&TOOLS,0, THREAD* CALL PETOOLS_LINK1  "%&TOOLS%" 
    }
_END

_ENDFILE  //_ENDFILE 后面部分根本不调入内存，就像不存在 
EXIT FILE 

//<2>PETOOLS.WCS: DSystem mdyblog.blog.163.com
//调用方式
//PETOOLS_LNK [PETOOLS目录]
//PECMD调用例子,查找所有petools目录。
//PECMD LOAD PETOOLS_LINK.WCS <**all|**allab> "PETOOLS"    //CMD 外部脚本 ,多线程
//LOAD PETOOLS_LINK.WCS <**all|**allab> "PETOOLS"    //外部脚本 ,多线程
//CALL PETOOLS_LINK     <**all|**allab> "PETOOLS"    //嵌入函数 ,多线程直接调函数
//CALL PETOOLS_LINK      "D:\PETOOLS"                //嵌入函数 ,单个目录,多线程直接调函数

//<1>PETOOLS.CMD: chenall
::petools扩展目录搜索安装程序 by chenall [url=http://www.chenall.comhttp://www.chenall.com[/color[/url]]
::思路来源：[url=http://bbs.wuyou.com/viewthread.php?tid=140951http://bbs.wuyou.com/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.com/viewthread.php?tid=158014

