Pier 软件包管理器:终极技术白皮书
一、 序言:为什么要有 Pier?
在 Windows 的世界里,安装软件通常意味着:双击 .exe -> 下一步 -> 下一步 -> 忍受广告 -> 注册表被塞满。
虽然有像 Scoop 或 Winget 这样的现代管理器,但它们往往需要复杂的运行环境(如 PowerShell 策略或 .NET)。
Pier 的哲学是:回归原始。
它诞生于一个朴素的想法——能不能只用 Windows 诞生之初就有的“老古董”技术,做一个像 Linux 那样干净、透明、自动化的包管理器?
Pier 的核心定义:
Pier 是一个基于 Batch(批处理) 逻辑内核,通过 HTA(网页程序) 提供交互界面,利用 7z/sed 等工具链实现软件下载、安装、卸载全生命周期管理的生态系统。
二、 Pier 的家族成员
为了让你从零理解,我们把 Pier 比作一个“自动售货机系统”:
-
柜台 (pier.bat):
这是你唯一需要直接打交道的入口。它负责接收你的命令(比如pier install wechat),然后去后台翻账本、调货。 -
账本 (lang.ini & sourceimage.ini):
记录了机器该说哪国语言,以及去哪个服务器地址下载软件。 -
电子显示屏 (install.hta):
当你准备买东西(安装)时,它会跳出来让你确认价格和信息。 -
打包工厂 (PierPacker):
这是生产商使用的工具。它负责把散装的程序零件(文件),封装成 Pier 能识别的“标准易拉罐”(.pie 格式)。
三、 图解:Pier 原理分析
3.1、各种文件是干什么的

3.2、Pier 执行全过程
四、 核心原理:HTA 对话框是如何工作的?

这是 Pier 最亮眼的地方。你看到的那个带有“确认安装”按钮的精美窗口,实际上是一个 HTA (HTML Application)。
1. 为什么不直接用 CMD 询问?
CMD 的 set /p 只能输入文字,不能点按钮,更不能显示精美的软件图标和排版。HTA 本质上是一个“拥有本地最高权限的 IE 浏览器渲染窗口”,它能调用 JavaScript 操作文件。
2. 跨进程通信:pier_choice.tmp
这是你代码中最精妙的逻辑。由于批处理无法直接读取网页里的变量,它们通过“写小纸条”的方式通信:
- 第一步:
pier.bat运行mshta install.hta。 - 第二步:HTA 运行,用户点击“确认”。
- 第三步:HTA 内部的 JS 代码执行:
fso.CreateTextFile("%TEMP%\\pier_choice.tmp").Write("Y")。 - 第四步:HTA 关闭,
pier.bat检查%TEMP%目录下有没有这个.tmp文件。 - 第五步:读到
Y,继续安装;没读到,直接退出。
3. HTA 界面视觉图

五、 PierPacker:软件是如何被制作出来的?
PierPacker.bat 和 Builder.hta 是 Pier 生态的“生产力工具”。没有它们,开发者就得手动写那些复杂的配置文件。
1. 打包流程分解
当你有一个文件夹(比如绿色版的软件),想把它变成 Pier 格式,你需要经历以下步骤:
-
信息采集 (Builder.hta):
你在界面上填入软件名、版本、作者、Autorun 脚本名称。 -
生成 Metadata:
Builder 会在你的源码文件夹里自动生成一个[软件名].metadata。这个文件是 Pier 安装时的“说明书”。 -
物理压缩 (7za.exe):
PierPacker会调用后台的 7zip 工具,把文件夹压缩成一个.pie后缀的压缩包。
2. PierPacker 架构图

六、 开发者必看:源码中的细节
1. 管理员权限的“静默夺取”
在 PierPacker.bat 中,有一段非常硬核的代码:
powershell -Command "Start-Process ... -Verb RunAs"
为什么要这么做?
因为打包过程需要调用系统级的 7za.exe 并往可能受到保护的目录下写文件。这段代码确保了用户双击运行时,如果权限不够,会自动跳出 UAC 弹窗申请管理员权限,而不需要用户手动右键运行。
2. Builder.hta 的 ActiveX 调用
Builder 之所以能读取你的文件夹路径,是因为它使用了 Windows 的壳层对象:
var shell = new ActiveXObject("Shell.Application");
var folder = shell.BrowseForFolder(0, "选择要打包的文件夹", 0);
七、 字典检索:sed.exe 的妙用
Pier 的核心没有使用复杂的数据库解析器,而是用了著名的流编辑器 sed.exe。
逻辑示例:
sed.exe -n "/\[welcome\]/{n;p}" lang.ini
口语化解释:
“喂,sed,帮我去 lang.ini 账本里找一个叫 [welcome] 的标签。找到了之后,别打印标签这一行,打印它的下一行内容。”
这种设计极其精妙:
- 极速:sed 处理文本的速度是毫秒级的。
- 解耦:你想改文字,只需要改
lang.ini,一通代码都不用动。
八、 全局组件流转逻辑
-
启动阶段:
pier.bat读取.share/config/language.ini确定语言。- 调用
sed从lang.ini抓取对应的翻译文字。
-
指令阶段:
- 用户输入
pier install wechat。 pier.bat访问sourceimage.ini获取下载服务器地址。
- 用户输入
-
交互阶段:
pier.bat生成一个包含环境参数的pier_env.tmp。start /wait install.hta。- 用户在 HTA 看到精美的软件介绍。
-
执行阶段:
- 如果用户点 Y,HTA 写下
pier_choice.tmp。 pier.bat醒来,调用uma-get.exe下载包。- 调用
unzip.exe解压包。 - 执行包内的
autorun.bat。
- 如果用户点 Y,HTA 写下
结语:古法技术的新生命
Pier 不是最先进的,但它一定是最“通透”的。通过对 pier.bat、PierPacker 以及各色 ini 文件的拆解,我们看到了一种利用原生能力解决复杂问题的匠心。
给开发者的建议:
如果你想扩展 Pier,不要试图加入厚重的库。保持它的轻量,保持它的 Batch + HTA 架构。这正是 Pier 区别于其他成千上万个软件管理器的独特魅力。
文档编写:Gemini Thought Partner
适用版本:Pier 2.0.0 & PierPacker 1.5.0+