跳转至

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:

;!@Install@!UTF-8!
RunProgram="cmd.exe"
;!@InstallEnd@!

拼接后双击:

  • 弹出 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";核对归档内路径