无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 56950|回复: 98
打印 上一主题 下一主题

发一个重新写的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, 下载次数: 318)

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

评分

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

查看全部评分

推荐
发表于 2009-12-21 22:49:46 | 只看该作者
支持,顶上……………
回复

使用道具 举报

推荐
发表于 2009-12-21 22:42:31 | 只看该作者
沙发!
chenall兄出手,必属精品。

对readme.txt类是否考虑?

[ 本帖最后由 pseudo 于 2009-12-21 22:44 编辑 ]
回复

使用道具 举报

4#
 楼主| 发表于 2009-12-21 22:57:55 | 只看该作者
原帖由 pseudo 于 2009-12-21 22:42 发表
沙发!
chenall兄出手,必属精品。

对readme.txt类是否考虑?


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

使用道具 举报

5#
发表于 2009-12-22 00:35:38 | 只看该作者
这个好,支持一个。。。~
回复

使用道具 举报

6#
发表于 2009-12-22 11:04:15 | 只看该作者
谢谢C大,好东西,下来试试
回复

使用道具 举报

7#
发表于 2009-12-22 11:14:30 | 只看该作者
试了一下,批处理比较花时间,得优化一下。
回复

使用道具 举报

8#
发表于 2009-12-22 11:30:07 | 只看该作者
我能想到的,chenall都想到了。没有什么新的建议。
倒是如pseudo所说,代码需要优化,速度提升是关键。
回复

使用道具 举报

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

使用道具 举报

10#
发表于 2009-12-22 13:53:34 | 只看该作者
chenall真是编程高手,以前总想去递规调用,而兄弟就是一个dir /s就搞定了,很巧,逻辑也很清晰。怪不得现在不点将g4d也交到你手上了。

有个建议,由于有的PE会将TEMP改变到硬盘或其他盘上,在这上面读写效率就很低,速度明显要慢,还是放到内存盘,速度明显要快,要么用windir来代替temp?

[ 本帖最后由 hhh333 于 2009-12-22 14:03 编辑 ]
回复

使用道具 举报

11#
发表于 2009-12-22 14:43:58 | 只看该作者
你给我们的,正是我们所需要的。这个工具考虑的太周到了,太好了!(就是慢点也无大碍),请问楼主(MicroPE的作者):这个工具在 Windows XP/2003 下能用吗?

[ 本帖最后由 h99h99 于 2009-12-22 14:45 编辑 ]
回复

使用道具 举报

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


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

使用道具 举报

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

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


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

使用道具 举报

14#
发表于 2009-12-22 15:55:59 | 只看该作者
支持一下,不错的思路,以后PE都兼容的话,大家就更方便了,呵呵

辛苦了,^_^
回复

使用道具 举报

15#
发表于 2009-12-22 16:46:48 | 只看该作者
存为搜索安装.cmd,以
FORX @\PETOOLS,TOOLS,0,EXEC !%CurDir%\搜索安装.cmd %TOOLS%
调用。
上一版可搜索到多个盘,第二版只搜到一个盘,有点诡异,我再试试。
回复

使用道具 举报

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


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

使用道具 举报

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

使用道具 举报

18#
发表于 2009-12-22 20:28:59 | 只看该作者
这么快就第三版了,支持不断更新优化!
回复

使用道具 举报

19#
发表于 2009-12-22 20:53:20 | 只看该作者
C大总是基础研究的先行者.

第三版最好.下来看下.
回复

使用道具 举报

20#
发表于 2009-12-22 22:48:56 | 只看该作者
虽然自己不会做PE,但是改改还是没问题的,进来学习下!
回复

使用道具 举报

21#
发表于 2009-12-22 23:39:54 | 只看该作者
YY后试用了一下,感觉不错。效果如图:
回复

使用道具 举报

22#
发表于 2009-12-22 23:46:00 | 只看该作者
又将原refresh.ini的语句改为调用petools搜索批处理,较原refresh.ini处理稍慢,总体感觉不错。
只有一点疑惑:
就是上图的盘工具下的“开始程序菜单.WIM”本是AutoRuns目录下的,显示却忽略了AutoRuns目录。
建议将AutoRuns目录及其该目录下的文件都忽略掉。

[ 本帖最后由 zxw 于 2009-12-22 23:50 编辑 ]
回复

使用道具 举报

23#
 楼主| 发表于 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 编辑 ]
回复

使用道具 举报

24#
发表于 2009-12-23 00:04:11 | 只看该作者
谢谢chenall大指导,明白了。
忽略AutoRuns目录的修改方法我也想到了,不过写代码可没你这么快、这么简洁。

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

使用道具 举报

25#
发表于 2009-12-23 00:40:05 | 只看该作者
CHENALL的功力很是深厚,本打算用AU3写个类似的程序,看来可以省省了,明天有时间试试效果如何
回复

使用道具 举报

26#
发表于 2009-12-23 01:56:48 | 只看该作者
高人出手,支持个。。。。
回复

使用道具 举报

27#
发表于 2009-12-23 08:15:18 | 只看该作者
精品啊!出手不凡,支持了。
回复

使用道具 举报

28#
发表于 2009-12-23 11:26:57 | 只看该作者
哪位能详细说明怎么用
回复

使用道具 举报

29#
发表于 2009-12-23 11:36:15 | 只看该作者
现在基本就将petools彻底解决了吧。。
回复

使用道具 举报

30#
发表于 2009-12-23 13:17:49 | 只看该作者
用法:(当然先要将chenall的文件存为PETOOLS_LINK.CMD)
1、用批处理调用此文件:建一个如下的批处理,与chenall的文件放在同一个地方即可运行它(chenall的说明中调用法是错误的)
  1. @ECHO OFF
  2. REM 搜索PETOOLS目录下文件并建立快捷方式
  3. SET "StartMenu=%USERPROFILE%\「开始」菜单"
  4. for %%i in (z y x w v u t s r q p o n m l k j i h g f e d c b a) do if exist %%i:\PETOOLS PETOOLS_LINK %%i:\PETOOLS
复制代码
2、以前如果用petools.ini来调用有点麻烦:
先将原文件中的if not defined StartMenu goto :eof改为
if not defined StartMenu SET "StartMenu=%USERPROFILE%\「开始」菜单"

再改原先的petools.ini为:
FORX @\PETOOLS,TOOLS,0,EXEC !CMD /C "PETOOLS_LINK %TOOLS%"

[ 本帖最后由 hhh333 于 2009-12-23 13:27 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-26 10:12

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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