无忧启动论坛

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

[分享] 给PE添加外置扩展功能详解

    [复制链接]
跳转到指定楼层
1#
发表于 2022-12-17 12:00:18 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖内容简单,没什么技术含量。我也是在本坛学的,算是一个学习笔记。还没有入门的喜欢动手的PE爱好者,可作为参考。本帖特点是一步一步按照操作就行,省得到处去查阅资料。这也是本人的一贯特点。本帖对大师们而言是一点用都没有,因为对他们来说太简单,属于基本常识。当然大师们若有闲情帮忙指出其中的不当之处、或者能优化之处、或者还有其他更好的办法,本人感激不尽。
除了喜欢精益求精的技术爱好者、或者具有其它目的的人们,可能大多数使用PE的人,是奔着PE本身的用处来的:就是维护系统和应急。论坛内外的PE有很多制作精良,随便拿来一款就能很好的使用。但是每款PE制作者有各自的理念,每个PE使用者有各自的想法,众口难调。
不少人没有时间、或像我一样没有能力自己去撸一个自己需要的PE出来。我的做法是,选择一款有比较强的核心功能、可扩展性强的PE,然后在里面加上一个加载脚本,再把自己需要的各种工具和驱动(把它叫插件)存放在PE之外的某个可见或隐藏分区(U)的某个地方,供PE启动时加载。这样既满足了自己的要求,升级或换PE也方便。PE升级了或换PE时,就用新的PE加上加载脚本。外置工具和驱动改变也方便,因为不用动PE.

点评

辛苦了  发表于 2024-3-27 18:31

评分

参与人数 5无忧币 +27 收起 理由
yyz2191958 + 2 赞一个!
2012sinkr + 5 赞一个!
gutaiping2006 + 5 非常好的教程
lough_007 + 5 很给力!
20090101 + 10 赞一个!

查看全部评分

2#
 楼主| 发表于 2022-12-17 12:00:30 | 只看该作者
本帖最后由 sunsmile23 于 2022-12-23 20:23 编辑

具体分作以下几步介绍:
1.修改PE,把加载脚本放进去。 2.加载脚本的编写。 3.插件的编写。

一、修改PE,添加加载脚本。
需要工具:DISMGUIUltraISOPE文件以雷电的为例。

具体步骤如下:
1. 如果PE是wim格式,略过这一步。如果是ISO格式,双击加载到虚拟光驱(或用UltraISO打开),把里面最大的那个wim格式文件拷贝出来。通常在sources文件夹下面,名叫Boot.wim,大小一般是几百M.

2. 使用DISMGUI编辑修改刚才拷贝出来的Boot.wim. 在我使用过的几种修改wim文件的工具中,DISMGUI最符合使用习惯,就是打开(这儿叫挂载)、修改、保存。而且最稳定可靠,也不用管什么细节。我修改过的几个wim文件(不多,也许不具有代表性)都可以稳定可靠的挂载、修改、保存。而其它几个工具均无法挂载。
按照下图所示123的顺序挂载需要修改的wim文件。注意,需要单击选中2框中需要修改的卷才能挂载,因为wim文件中也许不只一个卷。下图4框中便是挂载后的样子,但它只是名义上挂在那儿供我们查看修改,实际并没有把文件解出来放在那里,所以它并不占用挂载盘的空间。另外,必须把wim文件从虚拟光驱里面拷贝出来加载。如果直接在虚拟光驱加载,就只能是只读的,没法修改。


上图4框里面的东西(就是MOUN\BOOT_1下面的东西)就是该PE里面的内容。里面的东西可以按需求修改、增删。
我们这里是最简修改,只是添加一个加载脚本loadplugins.cmd而已。这需要做两件事,第一这个脚本放在哪里,第二要让PE能够启动它。
现在PE一般都是pecmd管理启动过程的,所以先在它的配置文件中加上启动语句。以便启动我们的脚本。如下图所示,在挂载的PE结构中,找到Windows\System32下面的Pecmd.ini, 在其末尾添加一句 EXEC %SystemRoot%\Loadplugins.cmd即可。这句话有两个意思要注意,第一就是你的脚本名称Loadplugins.cmd. 前面这样写在PE启动时加载窗口是可见的。如果加一个感叹号即这样写EXEC !%SystemRoot%\Loadplugins.cmd, 那么启动时加载窗口是不可见的,暗中进行的,我自己喜欢可见状态,这样我知道加载情况。

第二就是存放路径。比较方便的是使用它的内部预设路径,如这里的%SystemRoot%, 它代表PEWindows文件夹。我们就把加载脚本放在Windows文件夹里,如下图所示。当然,你放在其它的地方也行,只需在配置文件中写明路径即可。但最好使用内部预设的路径变量,如%SystemRoot%%programs%等。这种预设的路径变量就在上面的配置文件中去找。


文件放好后,在DISMGUI中的右边选中保存更改,然后单击保存并卸载,这个PE的wim文件便修改成功了。
所以DISMGUI修改wim文件很方便,符合我们的使用习惯(打开、修改、保存),也不用管wim文件的细节。

wim文件修改好后,再用UltraISO打开原来的ISO文件,把原来的boot.wim删除,换上修改后的wim文件,然后另存(最好是另存,不要按保存)。添加脚本操作结束。

回复

使用道具 举报

3#
 楼主| 发表于 2022-12-17 12:00:43 | 只看该作者
本帖最后由 sunsmile23 于 2023-1-10 21:35 编辑

二、编写加载脚本
加载脚本就是批处理文件,扩展名一般为.cmd,这是个纯文本文件,可以用记事本编写。
脚本要解决两个问题:寻找插件和加载。

先要明确插件的位置。插件可以放在硬盘分区(U)的一个文件夹中,如pe\plugins.

因为有可能放在隐藏分区,所以首先要把所有隐藏分区分配盘符,并显示出来。下面的语句可以达到这个目的:
pecmd SHOW -check -1:-1

我们使用一个for循环从后向前(包括U)遍历来查找存放插件的文件夹pe\plugins, 查找到后,就调用加载过程LoadPlugins. 注意调用参数"%%U:\pe\plugins"一定要加上英文引号,因为路径可能含有空格。下面的语句因为简单,会把所有分区上面放有pe\plugins的插件都加载。最后不要忘了写上exit,因为后面还要接着写加载过程:
for %%U in (Z Y X W VU T S R Q P O N M L K J I H G F E D C ) do (
  if exist %%U:\pe\plugins call :LoadPlugins "%%U:\pe\plugins"
)
exit

下面是加载过程。调用过程要以英文的冒号开头。过程的最后不要忘了写上goto :eof,因为后面可能还要继续写其他的过程。
:LoadPlugins
goto :eof

调用过程主要解决两件事:一是把插件解压到PE系统的某个位置,因为所有插件都是压缩包。二是调用插件中的设置脚本。

因为插件包可能不止一个,我们可以使用下面的语句来遍历所有的插件包(包括子文件夹)
for /r %1 %%i in (*.7z,*.rar,*.zip) do (
)
这里的%1代表前面传入的参数,就是前面找到的插件包的位置,如H:\pe\plugins,注意%1两端不能再用英文引号。里面的%%i代表遍历到的每一个压缩包,可以是7z, rar, zip格式,如H:\pe\plugins\chrome.7z.

对于遍历到的每一个压缩包,可以用下面的语句来解压:
"%ProgramFiles%\7-Zip\7z.exe" x "%%i" -y -aos -o"%ProgramFiles%\OutPlugins\%%~ni"
%ProgramFiles%是内部定义的一个变量,代表PE系统盘的Program Files. "%ProgramFiles%\7-Zip\7z.exe"代表7z.exe的路径,如果你的PE里面7z.exe不在这儿,就按你的PE里面的路径写。OutPlugins是统一存放插件解压后文件的位置,这个随便你自己设定。%%~ni是压缩包文件名,用作存放解压文件的文件夹名。

下面调用插件(压缩包)里面的设置脚本,即压缩包最顶层路径里面的所有cmdwcs
for /f "delims=" %%a in ('dir "%ProgramFiles%\OutPlugins\%%~ni\*.cmd" /b') do (
  PECMD EXEC ^^!^^%ProgramFiles%\OutPlugins\%%~ni\%%a
  PECMD wait 100
)
%ProgramFiles%\OutPlugins\%%~ni是刚才的解压文件夹,%%a是遍历到的里面的所有cmd脚本。如果你的插件里面不止一个cmd脚本,没法分先后。^^!^^是最小化执行窗口。
for /f "delims=" %%a in ('dir "%ProgramFiles%\OutPlugins\%%~ni\*.wcs" /b') do (
  PECMD LOAD %ProgramFiles%\OutPlugins\%%~ni\%%a
  PECMD wait 100
)
这里面的意义跟上面的cmd一样,只是调用方式不一样(EXEC/LOAD)
脚本编写完毕,还是很简单的。整个脚本看起来就是这个样子:

loadplugins.cmd
=========================
@echo off
    rem 设置变量延迟,以便下面 for 循环中给变量赋值
setlocal EnableDelayedExpansion

    rem 给隐藏盘分配盘符,以便下面搜索时访问
pecmd SHOW -check -1:-1

    rem 寻找插件的盘符 (插件存放文件夹为 pe\plugins、或 petools)
for %%U 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 ) do (
    if exist %%U:\pe\plugins (
            rem 找到了,例如 H:\pe\plugins,然后调用子过程,把插件路径作为参数传递
        call :LoadPlugins %%U:\pe\plugins
            rem 找到一份后,其余的盘就不看了
        exit
    ) else if exist %%U:\petools (
        call :LoadPlugins %%U:\petools
        exit
    )
)
exit

:LoadPlugins
    rem 参数%1就是前面传入的插件位置,如 H:\pe\plugins
    rem 本子过程使用了两种 for 循环来遍历磁盘文件
    rem for /r %1 %%i in (*.7z) do 支持子文件夹
    rem for %%i in (%1\*.cmd) do 不支持子文件夹
for /r %1 %%i in (*.7z,*.rar,*.zip) do (
        rem %%i 代表搜索到的每一个压缩文件,如 H:\pe\plugins\chrome.7z,
        rem 包括子文件夹,如 H:\pe\plugins\basics\FileTools.7z
        rem 这里 n 指文件名,如 %%~ni 就是 chrome 或 FileTools, 用作存放解压文件的文件夹名
        rem 路径 %ProgramFiles%\OutPlugins\%%~ni 就是如 X:\Program Files\OutPlugins\chrome
        rem 设置为变量 pp, 方便下面各处写路径,因为这个路径有多处使用
        rem 注意使用变量延迟后,使用变量的值要用 !pp!, 而不是 %pp%
    set pp=%ProgramFiles%\OutPlugins\%%~ni

        rem 解压到 !pp!。除了 7z.exe、%%i、!pp! 外,其它的是 7z 的解压参数。路径可能含有空格,所以要用双引号
    "%ProgramFiles%\7-Zip\7z.exe" x "%%i" -y -aos -o"!pp!"

        rem 执行 .cmd 批处理,%%a 代表 !pp! 文件夹里面的每一个 *.cmd, 如 chrome.cmd,!表示隐藏执行
    for %%a in ("!pp!\*.cmd") do (
        PECMD EXEC !"%%a"
        PECMD wait 100
    )

        rem 执行 .wcs 脚本,%%a 代表 !pp! 文件夹里面的每一个 *.wcs, 如 chrome.wcs
    for %%a in ("!pp!\*.wcs") do (
        PECMD LOAD "%%a"
        PECMD wait 100
    )
)
goto :eof
=========================

把上面两条双横线之间的内容复制下来,粘贴到记事本中。不过浏览器不知咋回事会吃掉一些空格,所以若是不能正常工作,或者不能按预期工作,要检查一下空格。检查完后,保存为loadplugins.cmd。通用插件加载脚本编写完毕。

编写完后,按照前面所述,加入你的PE中即可。当然,若怕麻烦,你也可以不加进PE中去,把它放在任何地方,硬盘、优盘都行。在你的PE启动后,人工去双击执行也行。实际上,你可以在使用PE的任何时候去执行。灵活、方便。

点评

小白向大佬请教:LoadPlugins中, set pp=%%~dpi set pp=!pp:%~1\=! set pp=%ProgramFiles%\OutPlugins\!pp!%%~ni语句,能否详解每句pp变量是啥意思,为何这样设置? 实在是没搞懂,  详情 回复 发表于 2023-1-8 12:01

评分

参与人数 1无忧币 +5 收起 理由
yyfankyo + 5 2.的内容漏了吗?

查看全部评分

回复

使用道具 举报

4#
 楼主| 发表于 2022-12-17 12:00:56 | 只看该作者
本帖最后由 sunsmile23 于 2022-12-30 15:51 编辑

三、编写插件
插件使用压缩包的方式,每个插件压缩成个文件,可以是7z, rar, zip格式。

下图是压缩包的结构。也就是说,在压缩包的最上层,要有一个或多个设置脚本。设置脚本可以是.cmd或者.wcs格式。不然的话,加载脚本就只会给你解压了事。


设置脚本的主要目的有两个:一是建立桌面或开始菜单的快捷方式,二是启动安装(如输入法、驱动程序)或进行一些设置(如有些免安装软件)。

1. 添加快捷方式
桌面快捷方式。如Chrome浏览器的目录结构如下图,它的主程序路径为Chrome_v81\App\Chrome.exe,那么桌面快捷方式在.cmd文件中的写法为:
pecmd link "%Desktop%\Chrome81","%~dp0Chrome_v81\App\Chrome.exe"
如下图所示:



写好保存为.cmd格式文本。如果快捷名称包括中文,似乎要用ansi编码,不然就会乱码。完成后全选打包即可,如下图所示。这就是一个最简单的插件写法。所有绿色直接运行的软件,若只考虑桌面快捷方式,都可以这样写。



开始菜单快捷方式。若希望在开始菜单中也加上一个快捷方式,可以写上如下语句:
pecmd link "%Programs%\网络工具\Chrome81","%~dp0Chrome_v81\App\Chrome.exe"
这是效果图:


一些技巧。为让插件适应性强,里面可以使用预设路径,如%Desktop%(桌面)、%Programs%(开始菜单)。%~dp0为批文件所在路径。这样的话不管解压到哪里,都能形成正确的快捷方式。如果是.wcs格式,可以省掉路径,使用相对路径,像这样:
Link "%Desktop%\Chrome81","Chrome_v81\App\Chrome.exe"

2. 执行设置或安装
有些软件使用前必须先运行一些批处理设置一下(如一些免安装软件),有些软件要安装才能使用(如输入法)

若是批处理,使用call进行调用,如:
call %~dp0PS_CS3\install.bat


若是安装,直接调用即可,如下图所示。软件支持自动静默安装最好,一般是加上/s参数。
%~dp0WinRAR_v6.11_Setup.exe /s


书写时注意路径。如前所述,建议使用 %~dp0 来代表批处理文件路径,或者改为.wcs格式,省掉路径。当然,下级子目录得写对。对于批处理文件,优先使用.wcs格式。上面的语句可以分别这样写:
EXEC =!PS_CS3\install.bat
EXEC =!WinRAR_v6.11_Setup.exe /s

上面介绍的是工具类型插件的编写。当然,当你熟悉以后,也不一定一个工具打一包,也可以众多工具打一包。比如同一类的磁盘工具打在一个包内,在设置文件中都写上相关的快捷方式和设置调用即可。只不过,一个工具打一包的方式取舍更灵活。

3.安装驱动
首先把众多驱动按文件夹放好集中打包,再放上驱动安装工具 DrvIndex.exe,写好安装脚本 installdrive.cmd,三个文件放一个文件夹中,再在上层文件夹里面写上供加载脚本调用的文件 installdrive.wcs,如下图所示:


然后一起压缩打包即可,如下图所示:


供加载脚本调用的 installdrive.wcs 中的语句如下,它就是调用 drivers 下面的安装脚本 installdrive.cmd:
EXEC drivers\installdrive.cmd

安装脚本 installdrive.cmd 的语句如下,就是调用 DrvIndex.exe 安装驱动:
DrvIndex.exe -b surface4.7z

DrvIndex.exe 不用解压整个驱动压缩包,直接从压缩包中搜索需要的驱动进行安装,性能不错。安装驱动的工具不少,我试用的结果是这一个能够成功安装的驱动个数最多。

4.现成的插件
如果懒得自己制作插件,也有很多现成的插件可用。比如 FirPE 网站介绍了一种 Edgeless 插件,并提供了下载地址,比较丰富,有各种应用、大量的驱动。

当然,Edgeless插件有一些特定的路径,要想使用它们,要么修改一下加载脚本,要么修改一下插件里面的路径。如迅雷精简版里面的设置内容为:
LINK X:\Users\Default\Desktop\迅雷精简版,%ProgramFiles%\Edgeless\迅雷PE版.exe

如果不改动前面的加载脚本的话,就需要把这一句改为:
LINK X:\Users\Default\Desktop\迅雷精简版,迅雷PE版.exe
一般而言,就是把Edgeless及其前面的路径删除便是。

本帖介绍的东西看起来多,主要是写得详细。其实不多,也简单。没有入门的朋友,稍稍操作一下就熟悉了。能够自己 DIY 一下,就又多了不少的选择,还是有乐趣的。家里的马桶不通了,自己尝试着捅一下,不仅省了几百块钱,关键是灵活快捷,不用眼巴巴靠别人,是吧。自己动手,丰衣足食。我这个人一是比较喜欢维持现状,不改动或者不要改动过多,二是喜欢透明,不喜欢黑盒子。比如,不喜欢程序一阵安装,往电脑上一通鼓捣,谁知道它私下干了些啥。在我的另一篇帖子中 (点击查看 把PE装在硬盘上--入门级),也更体现了这个特色。当然,有些朋友天生文字恐,看见字多就头晕目眩,哪怕实际上非常的简单。这种情况就只有让人同情了。关键是有些东西也不是几句话能说清楚的。本帖注意图文并茂,尽量降低理解难度。

我觉得能用插件的方式,就免除了有些选择的麻烦。因为很多时候我们看到这款PE这里好,那款PE那里好,很难取舍。其实它们大多数情况下主要是应用工具和驱动的差别。这恰好是本文的内容。以后,选好一款核心PE就行了。工具和驱动,拷贝到优盘上就行了。每款PE都能用。

下面给出一个例子。我把加载脚本加进了 Win10X64 雷电PE、快而稳 、网络版 19043.1237 229M (2022.12.19)更新。只添加了加载脚本,其它没有做任何变动。把插件放在硬盘或者优盘的 petools 文件夹(隐藏分区也可以),启动后自动加载:

本来是崭新的空房:

现在变成了豪华装修的HOUSE(当然你可以添加更多):

这里有更多的例子(PE及插件),可点击查看。其加载脚本有更强大的功能:
回复

使用道具 举报

5#
发表于 2022-12-17 12:08:40 | 只看该作者
谢谢分享
回复

使用道具 举报

6#
发表于 2022-12-17 12:20:44 | 只看该作者
坐等详细教程
回复

使用道具 举报

7#
发表于 2022-12-17 13:59:25 | 只看该作者
多谢分享,学习了。
回复

使用道具 举报

8#
发表于 2022-12-17 17:57:14 | 只看该作者
学习教程,坐等
回复

使用道具 举报

9#
发表于 2022-12-17 18:49:43 | 只看该作者
谢谢分享。
回复

使用道具 举报

10#
发表于 2022-12-17 21:16:11 | 只看该作者
谢谢分享
回复

使用道具 举报

11#
发表于 2022-12-18 14:04:32 | 只看该作者
感谢分享
回复

使用道具 举报

12#
发表于 2022-12-19 08:46:35 | 只看该作者
代表我这样的小白感谢,,楼主好人
回复

使用道具 举报

13#
发表于 2022-12-27 15:38:08 | 只看该作者
谢谢分享
回复

使用道具 举报

14#
发表于 2022-12-28 19:12:52 | 只看该作者
感谢分享
回复

使用道具 举报

15#
发表于 2022-12-29 11:05:08 | 只看该作者
谢谢分享,学习一下
回复

使用道具 举报

16#
发表于 2022-12-30 10:36:10 | 只看该作者
感谢分享!
我是把ventoy装硬盘里面,换pe更方便
回复

使用道具 举报

17#
发表于 2022-12-30 11:16:56 | 只看该作者
感谢楼主分享
回复

使用道具 举报

18#
发表于 2023-1-6 16:30:34 | 只看该作者
楼主不如把文件分享出来让我们自己添加
回复

使用道具 举报

19#
发表于 2023-1-8 12:01:39 | 只看该作者
sunsmile23 发表于 2022-12-17 12:00
二、编写加载脚本加载脚本就是批处理文件,扩展名一般为.cmd,这是个纯文本文件,可以用记事本编写。脚本要 ...

小白向大佬请教:LoadPlugins中,    set pp=%%~dpi set pp=!pp:%~1\=! set pp=%ProgramFiles%\OutPlugins\!pp!%%~ni语句,能否详解每句pp变量是啥意思,为何这样设置?
实在是没搞懂,

点评

楼主好人,注释非常详细,学习了,谢谢!  详情 回复 发表于 2023-1-10 08:08
那样写主要是想保持原来的文件夹结构 (如果含有子文件夹的话)。不过那样好像没有多少意义,还是统一解压到一个文件夹 OutPlugins 算了 (包括子文件夹的压缩包)。现增加了注释,你再去看看吧。  详情 回复 发表于 2023-1-9 22:46
回复

使用道具 举报

20#
 楼主| 发表于 2023-1-9 22:46:43 | 只看该作者
gutaiping2006 发表于 2023-1-8 12:01
小白向大佬请教:LoadPlugins中,    set pp=%%~dpi set pp=!pp:%~1\=! set pp=%ProgramFiles%\OutPlugin ...

那样写主要是想保持原来的文件夹结构 (如果含有子文件夹的话)。不过那样好像没有多少意义,还是统一解压到一个文件夹 OutPlugins 算了 (包括子文件夹的压缩包)。现增加了注释,你再去看看吧。
回复

使用道具 举报

21#
发表于 2023-1-9 23:07:59 | 只看该作者
没仔细看楼主的教程,随便看了一眼,那个搜寻外置插件的循环,其实pecmd有一个FORX命令挺好用的
回复

使用道具 举报

22#
 楼主| 发表于 2023-1-9 23:12:32 来自手机 | 只看该作者
是的。FORX很方便,但好像没有for灵活。
回复

使用道具 举报

23#
发表于 2023-1-10 08:08:45 | 只看该作者
gutaiping2006 发表于 2023-1-8 12:01
小白向大佬请教:LoadPlugins中,    set pp=%%~dpi set pp=!pp:%~1\=! set pp=%ProgramFiles%\OutPlugin ...

楼主好人,注释非常详细,学习了,谢谢!
回复

使用道具 举报

24#
发表于 2023-1-10 20:29:55 | 只看该作者
本帖最后由 absman1972 于 2023-1-15 22:08 编辑

感谢分享!
回复

使用道具 举报

25#
发表于 2023-1-10 21:39:34 | 只看该作者
感谢分享
回复

使用道具 举报

26#
发表于 2023-1-13 17:07:22 | 只看该作者
看看这个帖子,学习如何给PE添加外置扩展功能啊
回复

使用道具 举报

27#
发表于 2023-1-13 17:50:00 | 只看该作者
外置放在ISO镜像中安全性高点,编辑也方便。
  DEVI $%programfiles%\imdisk\imdisk.inf,DefaultInstall
.......
  FORX !\PEAppX\PEAppX.iso,&MyI,1,EXEC -hide -wait imdisk -a -f "%&MyI%" -m T:
.......
  快捷方式都可免了  要用时去 T:上找……。
回复

使用道具 举报

28#
发表于 2023-1-15 17:50:53 | 只看该作者
好文,图文并茂,谢谢分享
回复

使用道具 举报

29#
发表于 2023-1-19 10:18:39 来自手机 | 只看该作者
支持拔掉U盘不
回复

使用道具 举报

30#
发表于 2023-2-5 14:41:34 | 只看该作者
楼主第一步创建Loadplugins.cmd我都没成功
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-4-27 21:46

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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