无忧启动论坛

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

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

  [复制链接]
跳转到指定楼层
1#
发表于 2009-12-21 22:34:47 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
用的是批处理配合PECMD的LINK功能。
大家可以试一下:
规则
1.有找到REG文件就先执行注册该文件。
2.有找到PECMD.INI就不进行创建快捷方式,而是直接调用PECMD.INI(用于自定义),并且不再找下一级目录。(新版不支持这个)
3.有找到SETUP.BAT,setup.inf,setup.cmd,自动执行安装
4.搜到*.exe,*.wim,*.bat,*.cmd,并且不是SETUP.*的就创建快捷方式。
5.单个快捷方式合并(比如\其它工具\WINHEX\目录下只有一个WINHEX程序,则会把快捷方式创建在<其它工具>目录下).

Batchfile语言: [A href="http://fayaa.com/code/view/8492/]petools扩展目录搜索安装程序[/A]
::petools扩展目录搜索安装程序 by chenall http://www.chenall.com
::思路来源:http://bbs.wuyou.net/forum.php?mod=viewthread&tid=140951
::调用方式
::PETOOLS_LNK [PETOOLS目录]
::PECMD调用例子,查找所有petools目录。
::PECMD FORX @\PETOOLS,TOOLS,0,!EXEC PETOOLS_LINK %TOOLS%
::

@echo off
PATH %PATH%;%CD%
if not exist "%~F1" goto :eof
SET BASE_DIR=%~pnx1
::SET 外置程序="%StartMenu%\外置程序"
SET "外置程序=外置程序_%~d1盘"
SET "外置程序=%StartMenu%\%外置程序::=%"
IF EXIST "%外置程序%" RD /S /Q "%外置程序%"
MD "%外置程序%"
:START
PUSHD "%~F1"
for /f "delims=" %%a in ('dir /b/ad') do call :MAKE_LINK "%%a"
POPD
goto :eof

:MAKE_LINK
SETLOCAL
CD "%~1"
SET "PETOOLS=%~p1"
SET PETOOLS=%PETOOLS:~0,-1%
CALL,SET "PETOOLS=%%PETOOLS:%BASE_DIR%\=%%"
echo.%PETOOLS%
for %%i in (*.reg) do regedit /s "%%i"
if exist pecmd.ini (
pecmd load pecmd.ini
goto :eof
)
if exist setup.cmd call setup.cmd
if exist setup.bat call setup.bat
if exist setup.inf RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 "%%~fi"
for %%i in (*.exe,*.wim,*.bat,*.cmd) do (
if /i not "%%~ni"=="setup" PECMD LINK %外置程序%\%PETOOLS%\%%~ni,%%~fi
)
PUSHD "%外置程序%\%PETOOLS%\" 2>nul || GOTO :MAKE_LINK_D
set/an=0
for %%i in (*.lnk) do (
set/an+=1
)
if %n% LEQ 1 (
move /y *.lnk ..\
cd ..
rd /s /q "%外置程序%\%PETOOLS%\"
)
POPD
:MAKE_LINK_D
for /f "delims=" %%a in ('dir /b/ad') do call :MAKE_LINK "%%a"
goto :eof

第二版来了,看起来代码是更多了,但应该效率会有所提升,暂时还没有处理快捷方式合并


  • @echo off
  • if "%~1"=="" goto :eof
  • if not defined StartMenu goto :eof
  • if not exist "%~1" goto :eof
  • SET "BASE_DIR=%~1"
  • SET "外置程序=外置程序_%~d1"
  • SET "外置程序=%StartMenu%\%外置程序::=%"
  • IF EXIST "%外置程序%" RD /S /Q "%外置程序%"
  • :START
  • del "%temp%\PETOOLS_*.lst" 2>nul
  • PUSHD "%~F1"
  • >"%temp%\PETOOLS_LST.lst" dir /s/a/b *.wim *.cmd *.bat *.exe readme*.txt 使用说明*.txt
  • POPD
  • PUSHD "%TEMP%"
  • for /f "usebackq delims=" %%i in (PETOOLS_LST.lst) do CALL :MAKE_LINK "%%i"
  • START PECMD LOAD PETOOLS_LNK.INI
  • PUSHD "%~F1"
  • >"%temp%\PETOOLS_REG.lst" dir /s/a/b *.REG 2>nul
  • >"%temp%\PETOOLS_INF.lst" dir /s/a/b setup.inf 2>nul
  • POPD
  • if exist PETOOLS_REG.LST for /f "usebackq delims=" %%i in (PETOOLS_REG.LST) do REGEDIT /S "%%i"
  • if exist PETOOLS_INF.lst for /f "usebackq delims=" %%i in (PETOOLS_INF.lst) do RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 %%i
  • IF EXIST PETOOLS_SETUP.LST for /f "usebackq delims=" %%i in (PETOOLS_SETUP.LST) do CALL :PETOOLS_SETUP "%%i"
  • DEL petools_*.lst
  • POPD
  • goto :eof
  • :MAKE_LINK
  • SETLOCAL
  • if "%~1"=="" goto :eof
  • if /i "%~n1"=="setup" (
  • echo.%%i >>PETOOLS_SETUP.LST
  • goto :eof
  • )
  • SET ".=%~1"
  • SET ".=%.:&=^&%"
  • SET "PETOOLS=%~dpn1"
  • call,SET "PETOOLS=%%PETOOLS:%BASE_DIR%=%外置程序%%%"
  • SET "PETOOLS=%PETOOLS:&=^&%"
  • echo.LINK %PETOOLS%,%.%>>PETOOLS_LNK.INI
  • GOTO :EOF
  • :PETOOLS_SETUP
  • pushd "%~dp1"
  • call %~nx1
  • POPD
  • goto :eof
chenall发表于:  2009-12-22  13:21


第三版来了,处理了一下快捷方式的合并,解决临时文件冲突的问题(#15).
  • ::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
  • @echo off
  • if "%~1"=="" goto :eof
  • if not defined StartMenu goto :eof
  • if "%~1"=="merge" goto :merge
  • if not exist "%~1" goto :eof
  • SET "BASE_DIR=%~1"
  • SET "外置程序=外置程序_%~d1"
  • SET "外置程序=%StartMenu%\%外置程序::=%"
  • SET "_TF=%WinDir%\T_PETOOLS_%base_dir:~0,1%_"
  • IF EXIST "%外置程序%" RD /S /Q "%外置程序%" 2>nul
  • :START
  • DEL "%_TF%*.*" 2>nul
  • PUSHD "%~F1"
  • >%_TF%LST.lst dir /s/a/b *.wim *.cmd *.bat *.exe readme*.txt 使用说明*.txt
  • POPD
  • PUSHD "%WinDir%"
  • for /f "usebackq delims=" %%i in (%_TF%LST.lst) do CALL :MAKE_LINK "%%i"
  • ECHO.EXEC !%~F0 merge "%外置程序%" >>%_TF%LNK.INI
  • ECHO.FILE %_TF%LNK.INI>>%_TF%LNK.INI
  • START PECMD LOAD %_TF%LNK.INI
  • PUSHD "%~F1"
  • >"%_TF%REG.lst" dir /s/a/b SETUP_REG.REG 2>nul
  • >"%_TF%INF.lst" dir /s/a/b setup.inf 2>nul
  • POPD
  • if exist "%_TF%REG.LST" for /f "usebackq delims=" %%i in ("%_TF%REG.LST") do REGEDIT /S "%%i"
  • if exist "%_TF%INF.lst" for /f "usebackq delims=" %%i in ("%_TF%INF.lst") do RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 128 %%i
  • IF EXIST "%_TF%SETUP.LST" for /f "usebackq delims=" %%i in ("%_TF%SETUP.LST") do CALL :PETOOLS_SETUP %%i
  • DEL %_TF%*.lst
  • POPD
  • goto :eof
  • :MAKE_LINK
  • SETLOCAL
  • if "%~1"=="" goto :eof
  • if /i "%~n1"=="setup" (
  • echo.%1 >>"%_TF%SETUP.LST"
  • goto :eof
  • )
  • SET ".=%~1"
  • SET ".=%.:&=^&%"
  • SET "PETOOLS=%~dpn1"
  • call,SET "PETOOLS=%%PETOOLS:%BASE_DIR%=%外置程序%%%"
  • SET "PETOOLS=%PETOOLS:&=^&%"
  • echo.LINK %PETOOLS%,%.%>>%_TF%LNK.INI
  • GOTO :EOF
  • :PETOOLS_SETUP
  • ::为什么需要这些步骤呢,因为考虑到有一些批处理对执行目录的要求(编写时没有考虑到),所以才需要进入批处理目录执行.否则可能会出错.表面上是执行了,其实执行的结果是错误的.用PECMD调用同样会有这样的问题.
  • pushd "%~dp1"
  • PECMD EXEC !%~nx1
  • POPD
  • goto :eof
  • :merge
  • PUSHD %2||GOTO :EOF
  • for /d %%i in ("%~2\*") do call :merge_lnk "%%i"
  • POPD
  • goto :eof
  • :merge_lnk
  • CD /D %1||GOTO :EOF
  • for /d %%i in ("%~f1\*") do call %0 "%%i"
  • CD /D %1||GOTO :EOF
  • set n=
  • for /f %%i in ('dir /a/b') do (
  •     if defined n goto :eof
  •     set n=1
  • )
  • for /f "usebackq delims=" %%i in (`dir /a/b`) do move /y "%%i" ..\
  • cd..&&rd %1
  • goto :eof
chenall 发表于:  2009-12-22  20:07

[ 本帖最后由 chenall 于 2010-3-3 23:14 编辑 ]

Windows XP Professional-2009-12-21-22-38-16.png (58.09 KB, 下载次数: 269)

Windows XP Professional-2009-12-21-22-38-16.png

评分

参与人数 3无忧币 +20 收起 理由
slyneo + 5
2012abc. + 5 很给力!
2010ttt + 10 精品文章

查看全部评分

2#
 楼主| 发表于 2009-12-21 22:57:55 | 显示全部楼层
原帖由 pseudo 于 2009-12-21 22:42 发表
沙发!
chenall兄出手,必属精品。

对readme.txt类是否考虑?


没有哦,考虑一下觉得应该加上.呵呵,明天再加了.
回复

使用道具 举报

3#
 楼主| 发表于 2009-12-22 13:25:16 | 显示全部楼层
第二版来了,重新编写,调整了处理的方式。
先创建快捷方式,然后再处理注册,这样“看起来”会比较快。呵呵。
回复

使用道具 举报

4#
 楼主| 发表于 2009-12-22 14:52:40 | 显示全部楼层
原帖由 h99h99 于 2009-12-22 14:43 发表
你给我们的,正是我们所需要的。这个工具考虑的太周到了,太好了!(就是慢点也无大碍),请问楼主(MicroPE的作者):这个工具在 Windows XP/2003 下能用吗?


这里面创建快捷方式使用的是PECMD,所以需要有一个PECMD.EXE程序。
回复

使用道具 举报

5#
 楼主| 发表于 2009-12-22 14:54:27 | 显示全部楼层
原帖由 hhh333 于 2009-12-22 13:53 发表
chenall真是编程高手,以前总想去递规调用,而兄弟就是一个dir /s就搞定了,很巧,逻辑也很清晰。怪不得现在不点将g4d也交到你手上了。

有个建议,由于有的PE会将TEMP改变到硬盘或其他盘上,在这上面读写效率 ...


这个倒没有注意,用%WINDIR%也许会比较好些。呵呵。
回复

使用道具 举报

6#
 楼主| 发表于 2009-12-22 17:46:34 | 显示全部楼层
原帖由 pseudo 于 2009-12-22 16:46 发表
存为搜索安装.cmd,以
FORX @\PETOOLS,TOOLS,0,EXEC !%CurDir%\搜索安装.cmd %TOOLS%
调用。
上一版可搜索到多个盘,第二版只搜到一个盘,有点诡异,我再试试。


汗,忘了这个是因为并发的原因,临时文件是同样的,所以当然出错了.下次改进.
回复

使用道具 举报

7#
 楼主| 发表于 2009-12-22 20:10:17 | 显示全部楼层
OK,解决了,顺便处理一下快捷方式合并.如果没有问题就这样子了.
回复

使用道具 举报

8#
 楼主| 发表于 2009-12-22 23:57:04 | 显示全部楼层
关于上面的问题,见规则5.
5.单个快捷方式合并(比如\其它工具\WINHEX\目录下只有一个WINHEX程序,则会把快捷方式创建在<其它工具>目录下).
只有单目录时也同样,这样对于非单文件打包的程序,看起来会比较清爽,具体可以多试试就知道了.

要忽略了AutoRuns目录需要自己改下代码.比如在
:MAKE_LINK下添加一行
echo.%1|find /i "\AutoRuns\" &&goto :eof
::如果有包含AutoRuns就跳过.

[ 本帖最后由 chenall 于 2009-12-23 00:00 编辑 ]
回复

使用道具 举报

9#
 楼主| 发表于 2009-12-23 18:02:27 | 显示全部楼层
我认为还是简单一些使用START /w 来调用,或许会比较好,因为并行时如果操作比较复杂,可能会造成死机.一般程序比较少的情况下使用并行是没有问题的,但如果需要执行的比较多,而且配置又不是很好的情况下,绝对会卡死.
回复

使用道具 举报

10#
 楼主| 发表于 2009-12-23 18:14:19 | 显示全部楼层
使用start 碰到exit就不会退出了.如果start /w 不行,那PECMD =执行应该会是同样的
#32的建议不错,还是有个规则会比较好,
只要SETUP.CMD和SETUP.BAT就可以了,另外再加一个SETUP.REG.就差不多了,因为有时只需要导入注册表文件就不用再写SETUP.BAT了.
回复

使用道具 举报

11#
 楼主| 发表于 2009-12-23 18:17:56 | 显示全部楼层
@gosun
这也是使用start命令需要注意的一点,呵呵.有时候不注意就会出错.
回复

使用道具 举报

12#
 楼主| 发表于 2010-1-9 00:43:14 | 显示全部楼层
@h99h99
谢谢反馈。。

对不起,是我的错,没有经过测试,写错了符号,已经在原贴(第三版)更新。
回复

使用道具 举报

13#
 楼主| 发表于 2010-1-9 19:06:49 | 显示全部楼层
@h99h99
OK,再改一下。
改成了使用PECMD调用了,使用START调用批处理后面要有EXIT。
回复

使用道具 举报

14#
 楼主| 发表于 2010-3-3 23:13:47 | 显示全部楼层
原帖由 haiou327 于 2010-2-28 00:43 发表
大方便了程序外置

chenall在CODE说明里改过来吧


PECMD FORX @\PETOOLS,TOOLS,0,EXEC !cmd /c "PETOOLS_LINK %TOOLS%"

82904



不加cmd /c好像也可以的吧,忘了。呵呵。
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-21 21:01

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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