7-Zip SFX 标准打包规范:为何 7zSD.sfx 是唯一正确的安装型 Stub
1) 铁律(Agent/新人应缓存的结论)
7z.sfx(标准 SFX)只能"解压":不解析RunProgram,不执行安装流程。7zSD.sfx(安装型 SFX)才能"解压 + 执行":支持RunProgram / InstallPath / Silent / GUIMode。
90% 的"配置无效 / 弹 Extract-to"问题,根因只有一个:Stub 用错。
2) 选型对照表(可 RAG 直抽)
| 属性 | 标准版(不要用) | 安装版(应使用) |
|---|---|---|
| 文件名 | 7z.sfx |
7zSD.sfx |
| 典型大小 | ~38 KB | ~120–160 KB |
| 能力 | 解压 | 解压 + 执行 |
RunProgram |
❌ 被忽略 | ✅ 有效 |
| 典型症状 | 必然弹 "Extract to…" 对话框 | 可按配置走静默/对话框 |
3) 最小正确配置文件(UTF-8 无 BOM)
;!@Install@!UTF-8!
Title="Internet Cafe Customizer"
InstallPath=".\\ "
RunProgram="scripts\\batch\\sfx_entry.bat"
;!@InstallEnd@!
关键约束:
InstallPath=".\\ ":解压到 EXE 所在目录(SFX 以自身路径为基准)RunProgram路径:相对于解压根目录- 配置文件必须 UTF-8 无 BOM(带 BOM 会解析异常)
4) 标准构建(PowerShell,确定性最高)
$stub = "tools\7z\7zSD.sfx"
$cfg = "configs\sfx_config.txt"
$archive = "build\temp.7z"
$outExe = "dist\installer.exe"
# 1) 打 7z 归档(示例)
& "tools\7z\7za.exe" a -t7z $archive (Join-Path PWD payload) -mx=9
# 2) 二进制拼接:stub + config + 7z
[byte[]]$bin =
[IO.File]::ReadAllBytes($stub) +
[IO.File]::ReadAllBytes($cfg) +
[IO.File]::ReadAllBytes($archive)
[IO.File]::WriteAllBytes($outExe, $bin)
Write-Host "Built: $outExe"
不建议依赖
copy /b的隐式编码表现;PowerShell 拼接更可审计、可复现。
5) 30 秒自检(判断手里 Stub 对不对)
用最小 config:
拼接后双击:
- 弹出 CMD 窗口 → Stub 支持安装型 ✅
- 弹出 "Extract to" 对话框 → 这是
7z.sfx,换7zSD.sfx❌
6) 快速排错矩阵
| 现象 | 根因 | 修复 |
|---|---|---|
| 必弹 Extract-to | Stub=7z.sfx |
换官方 7zSD.sfx |
| RunProgram 像不存在 | 同上(Stub 不吃安装参数) | 同上 |
| 双击完全无反应 | Stub 非官方/损坏/位数怪 | 用 7-Zip 安装目录或 LZMA SDK 的 bin\7zSD.sfx |
| 解压成功但脚本找不到文件 | 工作目录/相对路径错 | bat 首行 cd /d "%~dp0";核对归档内路径 |