hfut 发表于 2015-6-24 20:29:22

【从此不需编写菜单配置文件!贡献一套原创自动菜单生成脚本】

本帖最后由 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:24

超级大神?!!!前排膜拜!

xzf680 发表于 2015-6-24 22:14:31

这个点子强,学习一下,感谢无私奉献!

hfut 发表于 2015-6-24 22:55:08

还有点问题,不能自动创建到目录分类……

x9tian 发表于 2015-6-25 01:03:32

我是来打击楼主的:
楼主的遇到system.exe 是个文件夹 也会创建快捷方式。
明明一个for语句就行了,还用了一线,

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

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


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

for /f"delims=*" %%i in ('dir /a-d/b/s .\*.exe') doPECMD link %desktop%p\%%~ni,%%~fi

nmscl 发表于 2015-6-25 06:03:50

偶不懂这个,学习一下,

lbw2007 发表于 2015-6-25 07:09:52

唉,又该解开我的wim包了……

神器支持一下!

永恒心锁 发表于 2015-6-25 08:00:50

这个不错,支持大神的完善

527104427 发表于 2015-6-25 08:24:55

本帖最后由 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:47

支持大神的完善

engineerlzk 发表于 2015-6-25 10:14:07

到底哪种方法更好啊?

x9tian 发表于 2015-6-25 11:03:41

527104427 发表于 2015-6-25 08:24
直接用PECMD脚本不是更简单吗? 而且效率非常高,批处理根本没法比

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


我能说有二年半没碰过 PECMD了么,现在的PECMD我都敢脚自己落伍了

hfut 发表于 2015-6-25 12:00:17

x9tian 发表于 2015-6-25 01:03
我是来打击楼主的:
楼主的遇到system.exe 是个文件夹 也会创建快捷方式。
明明一个for语句就行了, ...

感谢大神的分享!
抛砖引玉果然是好,哈哈!

hfut 发表于 2015-6-25 12:01:46

527104427 发表于 2015-6-25 08:24
直接用PECMD脚本不是更简单吗? 而且效率非常高,批处理根本没法比

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


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

问题又来了,当前目录下,我只希望处理部分若干个文件夹,因为有些文件夹是不需要生成菜单的,怎么破?

527104427 发表于 2015-6-25 12:05:50

hfut 发表于 2015-6-25 12:01
效率确实是高!感谢大神的分享!
抛砖引玉果然是好,哈哈!



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

比如,文件名为什么开头

hfut 发表于 2015-6-25 12:38:48

本帖最后由 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:12

527104427 发表于 2015-6-25 12:05
这就需要你提出条件,什么情况下是不需要生成的?

比如,文件名为什么开头

膜拜五大,
五大呀能出个什么pecmd的 经验笔记不。
这可是民生工程呀!
我现在打开PECMD看里面的说明看得头都晕, 感觉现在的说明文档看不太明白半,比老九写的多了

527104427 发表于 2015-6-25 18:25:17

本帖最后由 527104427 于 2015-6-26 05:40 编辑

hfut 发表于 2015-6-25 12:38
比如:
AAA
BBB


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

PETOOLS.WCS:

527104427 发表于 2015-6-25 18:28:18

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


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

我也是啃着PECMD的说明,一步一步实现自己想要的功能。不懂的多问问M大吧,程序是他写的,他就是一部活字典。。。

zoukongyijia 发表于 2015-6-25 20:46:51

深山红叶回来了!膜拜。
你的工具箱我用过很多版。你的故事也看了一些。

2011npwjm 发表于 2015-6-25 20:59:18

谢谢楼主的分享

hfut 发表于 2015-6-25 21:56:36

527104427 发表于 2015-6-25 18:25
不用这么麻烦,我给你写一段吧。直接在网站插入代码有点问题,还是打包上来算了。

PETOOLS.WCS:

再次感谢大神!
代码非常的好用!
但在具体的实施上,今天试了多种方案,最终还是采用了“总-分”的方式,即在总脚本中调用各目录中的分脚本。当然,大神的脚本不管是在总脚本还是在分脚本上使用都是极好的,主要是看自己希望整体架构是完全一体化还是总分式,决定是否灵活拆分脚本功能。
为什么要这么做呢?
主要是方便维护。因为我们可能除了创建菜单外,还需要对个别程序进行个性化处理,比如注册个DLL右键看图、添加个文件关联什么的,等等,以前各大侠们都是放在总脚本中,但有时可能维护起来因条目太多而比较麻烦;另外,我们日后可能会经常对各目录中的文件进行调整。因此,将脚本拆分到各个子目录中,对于日后维护会有极大便利,动了哪个目录中的内容,则同步打开这个目录中的脚本就行了,内容都不多,一目了然,想出错都难,即使出错也不会影响全局。

wylgogogo 发表于 2015-6-25 22:15:08

   留下这代码,以后有用。

devilma 发表于 2015-6-25 22:28:09

不错!五大威武

hfut 发表于 2015-6-26 07:13:48

实测中发现,有些程序是不能改名的,改名会导致运行异常,比如WPS的组件et.exe等等。此时可在分脚本里面加入针对快捷方式重命令的命令;还有些程序目录中存在一些不需用户直接调用的EXE文件,可添加删除其快捷方式命令。比如:
FILE %desktop%\et.lnk>>WPS电子表格.lnk//重命令快捷方式
FILE %desktop%\wxy.lnk   //删除个别无用的快捷方式
幸好这种情况非常少。

pseudo 发表于 2015-12-17 23:18:31

向深山红叶emca前辈致敬!

wbz2cdma 发表于 2015-12-18 22:55:39

向热心助人的五大致敬!

ztjun518 发表于 2019-5-18 14:29:08

向深山红叶emca前辈致敬!

huang1987 发表于 2023-11-25 14:00:57

谢谢分享

创新科技2015 发表于 2023-11-25 20:57:28

        很给力!
页: [1] 2
查看完整版本: 【从此不需编写菜单配置文件!贡献一套原创自动菜单生成脚本】