无忧启动论坛

标题: 【从此不需编写菜单配置文件!贡献一套原创自动菜单生成脚本】 [打印本页]

作者: hfut    时间: 2015-6-24 20:29
标题: 【从此不需编写菜单配置文件!贡献一套原创自动菜单生成脚本】
本帖最后由 hfut 于 2015-6-24 20:43 编辑

制作PE时,桌面、开始菜单、任务栏等需要生成工具菜单以方便调用。传统方法都是手工逐条编辑INI菜单配置文件,然后用 PECMD LOAD XXX.INI的命令执行并生成菜单快捷方式。这种方法工作量大,极易出错,偶尔调整了一个软件时,如果忘记同步编辑菜单的话,铁定会出错,无法生成对应的菜单项!

从此以后,调整软件只需把程序直接拷贝到工具目录的对应子目录中就行了,脚本会自动寻找 EXE 并按对应的子目录分类生成菜单配置,无需手工改INI文件!

建议一个工具只有一个EXE,如果有多个的话,建议打包成一个EXE,以免生成无关菜单项。

因此就有了制作一个自动生成菜单配置文件的想法。以下代码已经测试通过,瞬间生成菜单配置文件。
实际使用时,可先隐藏执行这个菜单配置生成脚本,然后再加载它生成的配置文件。
===========以下是代码===========
@echo off
rem PE 自动生成工具菜单配置文件脚本
rem By 深山红叶
rem 从此不用逐条编写菜单了!
rem 声明:自由,谢绝捆绑、给浏览器改主页、加尾巴的人使用!
rem
rem 1.请将本脚本文件在工具目录的顶层目录(比如 \PETOOLS);
rem 2.请将工具程序分门别类存放在工具子目录,注意程序文件名务必用生成菜单时要用的名称,比如“Diskgenu.exe”建议改成“磁盘精灵.exe”,以方便生成菜单后的菜单项直接拥有直观的名称。

rem 以下是效果演示,可放在某个目录下运行测试
rem 先清除临时文件,方便测试时避免重复生成内容
del %TEMP%\*.ini
setlocal EnableDelayedExpansion
rem 以下临时文件扩展名故意用INI,以方便以上一条命令清除。PE下由于临时目录下不太可能存在这类文件,因此清除临时文件的命令可不要。此仅为测试方便考虑。
FOR /F "delims==" %%i IN ('dir *.exe /s /b') DO @echo %%~fi>>%TEMP%\~1.ini
FOR /F "delims==" %%i IN ('dir *.exe /s /b') DO @echo %%~ni>>%TEMP%\~2.ini
set n=0
for /f "tokens=*" %%a in (%TEMP%\~1.ini) do (set /a n+=1
set a!n!=%%a
set x=!n!)
set n=0
for /f "tokens=*" %%b in (%TEMP%\~2.ini) do (set /a n+=1
set b!n!=%%b)
for /l %%c in (1,1,%x%) do (if defined b%%c echo LINK 路径变量\!b%%c!,!a%%c!>>%TEMP%\TOOLS.INI)
rem 上一行为测试直观,使用了“路径变量”替代真正 变量名。实际使用时要改成以下类似的内容,下例用的是桌面的路径变量即%Desktop%
rem for /l %%c in (1,1,%x%) do (if defined b%%c echo LINK %Desktop%\!b%%c!,!a%%c!>>%TEMP%\TOOLS.INI)

rem 以下命令是方便测试,用记事本打开菜单配置内容。实际使用时可改成(rem 注释标志不要!):
rem PECMD LOAD %TEMP%\TOOLS.INI
Notepad %TEMP%\TOOLS.INI

========代码结束=======

这里放出来,供大家测试并指正,以便进一步完善。

另,以前本人的emca的ID好久不登录,已经无效了,联系管理员也没能找回来。

作者: reak    时间: 2015-6-24 20:33
超级大神?!!!前排膜拜!
作者: xzf680    时间: 2015-6-24 22:14
这个点子强,学习一下,感谢无私奉献!
作者: hfut    时间: 2015-6-24 22:55
还有点问题,不能自动创建到目录分类……
作者: x9tian    时间: 2015-6-25 01:03
我是来打击楼主的:
楼主的遇到  system.exe 是个文件夹 也会创建快捷方式。
明明一个for  语句就行了,还用了一线,

生存配置菜单,然后自动挂载

  1. @echo off
  2. rem bbs.wuyou.net ^@ BY x9tian
  3. (for /f  "delims=*" %%i in ('dir /a-d/b/s .\*.exe') do (
  4.        
  5.         echo.link %desktop%p\%%~ni,%%~fi
  6. ))>.\test.ini
  7. pecmd load .\test.ini && del /a .\test.ini
复制代码


菜单二: 鬼都不生存一筒直截创 快键

  1. for /f  "delims=*" %%i in ('dir /a-d/b/s .\*.exe') do  PECMD link %desktop%p\%%~ni,%%~fi
复制代码

作者: nmscl    时间: 2015-6-25 06:03
偶不懂这个,学习一下,
作者: lbw2007    时间: 2015-6-25 07:09
唉,又该解开我的wim包了……

神器支持一下!
作者: 永恒心锁    时间: 2015-6-25 08:00
这个不错,支持大神的完善
作者: 527104427    时间: 2015-6-25 08:24
本帖最后由 527104427 于 2015-6-26 05:41 编辑

直接用PECMD脚本不是更简单吗? 而且效率非常高,批处理根本没法比

FORX /S   %CurDir%\*,&&f,,
{
        FNAM &&s=%&f%
        FEXT &&u=%&f%
        IFEX %&f%\,! FIND $%&s%<>, FIND $%&u%=exe, LINK %desktop%\%s%,%&f%
}


PETOOL.WCS下载
作者: tzxinqing    时间: 2015-6-25 09:35
支持大神的完善
作者: engineerlzk    时间: 2015-6-25 10:14
到底哪种方法更好啊?
作者: x9tian    时间: 2015-6-25 11:03
527104427 发表于 2015-6-25 08:24
直接用PECMD脚本不是更简单吗? 而且效率非常高,批处理根本没法比

FORX /S   %CurDir%\*,&&f,,

我能说有二年半没碰过 PECMD了么,  现在的PECMD我都敢脚自己落伍了
作者: hfut    时间: 2015-6-25 12:00
x9tian 发表于 2015-6-25 01:03
我是来打击楼主的:
楼主的遇到  system.exe 是个文件夹 也会创建快捷方式。
明明一个for  语句就行了, ...

感谢大神的分享!
抛砖引玉果然是好,哈哈!
作者: hfut    时间: 2015-6-25 12:01
527104427 发表于 2015-6-25 08:24
直接用PECMD脚本不是更简单吗? 而且效率非常高,批处理根本没法比

FORX /S   %CurDir%\*,&&f,,

效率确实是高!感谢大神的分享!
抛砖引玉果然是好,哈哈!

问题又来了,当前目录下,我只希望处理部分若干个文件夹,因为有些文件夹是不需要生成菜单的,怎么破?
作者: 527104427    时间: 2015-6-25 12:05
hfut 发表于 2015-6-25 12:01
效率确实是高!感谢大神的分享!
抛砖引玉果然是好,哈哈!

这就需要你提出条件,什么情况下是不需要生成的?

比如,文件名为什么开头
作者: hfut    时间: 2015-6-25 12:38
本帖最后由 hfut 于 2015-6-25 13:03 编辑
527104427 发表于 2015-6-25 12:05
这就需要你提出条件,什么情况下是不需要生成的?

比如,文件名为什么开头


比如:
AAA
BBB
CCC

现在只想生成 AAA 和BBB 的目录下程序的菜单。

当然,可以考虑在需要生成菜单的子目录下存放一个包含自动生成脚本的INI文件,由一个总的配置文件分别LOAD调用这些子目录中的配置。
主要目的是根据程序的目录分类,创建同名分类的菜单类别。比如下例的“磁盘工具”分类。否则所有类别的程序快捷方式全聚在一块,不方便查找。
比如:分类菜单目录”磁盘工具“添加一个MENU.INI,内容如下:
FORX /S   %CurDir%\*,&&f,,
{
        FNAM &&s=%&f%
        FEXT &&u=%&f%
        FIND $%&s%<>, FIND $%&u%=exe, LINK %quicklaunch%\磁盘工具\%s%,%&f%
}
然后,在LOAD.INI中调用上述脚本配置:LOAD %Curdir%\磁盘工具\MENU.INI
作者: x9tian    时间: 2015-6-25 14:08
527104427 发表于 2015-6-25 12:05
这就需要你提出条件,什么情况下是不需要生成的?

比如,文件名为什么开头

膜拜五大,  
五大呀能出个什么pecmd的 经验笔记不。
这可是民生工程呀!  
我现在打开PECMD看里面的说明看得头都晕, 感觉现在的说明文档看不太明白半,比老九写的多了
作者: 527104427    时间: 2015-6-25 18:25
本帖最后由 527104427 于 2015-6-26 05:40 编辑
hfut 发表于 2015-6-25 12:38
比如:
AAA
BBB


不用这么麻烦,我给你写一段吧。直接在网站插入代码有点问题,还是打包上来算了。

PETOOLS.WCS:

PETOOLS.rar

1.18 KB, 下载次数: 318, 下载积分: 无忧币 -2


作者: 527104427    时间: 2015-6-25 18:28
x9tian 发表于 2015-6-25 14:08
膜拜五大,  
五大呀能出个什么pecmd的 经验笔记不。
这可是民生工程呀!  

这个,还真没有啥笔记经验的。

我也是啃着PECMD的说明,一步一步实现自己想要的功能。不懂的多问问M大吧,程序是他写的,他就是一部活字典。。。
作者: zoukongyijia    时间: 2015-6-25 20:46
深山红叶回来了!膜拜。
你的工具箱我用过很多版。你的故事也看了一些。
作者: 2011npwjm    时间: 2015-6-25 20:59
谢谢楼主的分享
作者: hfut    时间: 2015-6-25 21:56
527104427 发表于 2015-6-25 18:25
不用这么麻烦,我给你写一段吧。直接在网站插入代码有点问题,还是打包上来算了。

PETOOLS.WCS:

再次感谢大神!
代码非常的好用!
但在具体的实施上,今天试了多种方案,最终还是采用了“总-分”的方式,即在总脚本中调用各目录中的分脚本。当然,大神的脚本不管是在总脚本还是在分脚本上使用都是极好的,主要是看自己希望整体架构是完全一体化还是总分式,决定是否灵活拆分脚本功能。
为什么要这么做呢?
主要是方便维护。因为我们可能除了创建菜单外,还需要对个别程序进行个性化处理,比如注册个DLL右键看图、添加个文件关联什么的,等等,以前各大侠们都是放在总脚本中,但有时可能维护起来因条目太多而比较麻烦;另外,我们日后可能会经常对各目录中的文件进行调整。因此,将脚本拆分到各个子目录中,对于日后维护会有极大便利,动了哪个目录中的内容,则同步打开这个目录中的脚本就行了,内容都不多,一目了然,想出错都难,即使出错也不会影响全局。
作者: wylgogogo    时间: 2015-6-25 22:15
     留下这代码,以后有用。
作者: devilma    时间: 2015-6-25 22:28
不错!五大威武
作者: hfut    时间: 2015-6-26 07:13
实测中发现,有些程序是不能改名的,改名会导致运行异常,比如WPS的组件et.exe等等。此时可在分脚本里面加入针对快捷方式重命令的命令;还有些程序目录中存在一些不需用户直接调用的EXE文件,可添加删除其快捷方式命令。比如:
FILE %desktop%\et.lnk>>WPS电子表格.lnk  //重命令快捷方式
FILE %desktop%\wxy.lnk   //删除个别无用的快捷方式
幸好这种情况非常少。
作者: pseudo    时间: 2015-12-17 23:18
向深山红叶emca前辈致敬!
作者: wbz2cdma    时间: 2015-12-18 22:55
向热心助人的五大致敬!
作者: ztjun518    时间: 2019-5-18 14:29
向深山红叶emca前辈致敬!
作者: huang1987    时间: 2023-11-25 14:00
谢谢分享
作者: 创新科技2015    时间: 2023-11-25 20:57
        很给力!
作者: 青青草    时间: 2023-12-22 22:58
527104427 发表于 2015-6-25 08:24
直接用PECMD脚本不是更简单吗? 而且效率非常高,批处理根本没法比

FORX /S   %CurDir%\*,&&f,,


PETOOL.WCS如何使用?
作者: AcidBurn    时间: 2023-12-26 15:46
感谢分享
作者: bsdgsos    时间: 2024-5-5 12:12
教程收藏




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3