下面我将详细解释 Inno Setup 安装参数的各个方面,包括核心概念、常用参数、高级用法以及如何在实际项目中使用。

(图片来源网络,侵删)
核心概念:[Setup] 段的 Parameters 指令
在 Inno Setup 的脚本文件 (.iss) 中,你需要在 [Setup] 段落中添加一个 Parameters 指令来定义你自己的命令行参数。
[Setup] ; ... 其他指令 ... ; 定义你的自定义参数 ; 格式: /参数名[:参数值] Parameters="/myparam /anotherparam:somevalue /config:"C:\my config.ini""
语法规则:
- 前缀: 所有自定义参数都必须以 开头。
- 参数名: 由字母、数字和下划线组成,不区分大小写。
- 参数值:
- 如果参数有值,使用 分隔符,
/path:C:\Program Files\MyApp。 - 参数值可以包含空格,但需要用双引号 括起来,
/config:"C:\Program Files\MyApp\config.ini"。 - 如果参数没有值,它就相当于一个开关,
/silent。
- 如果参数有值,使用 分隔符,
内置的命令行参数
除了自定义参数,Inno Setup 自身也提供了一系列内置的命令行参数,用于控制安装程序的行为,这些参数通常放在自定义参数之前。
| 参数 | 描述 | 示例 |
|---|---|---|
/DIR="x:\path" |
指定安装目标目录,如果目录不存在,安装程序会尝试创建。 | setup.exe /DIR="C:\My New App" |
/GROUP="name" |
指定开始菜单文件夹名称。 | setup.exe /GROUP="My Company Tools" |
/TYPE=type |
指定安装类型,常见值: - normal: 标准安装- compact: 紧凑安装- custom: 自定义安装- update: 更新安装 |
setup.exe /TYPE=compact |
/COMPONENTS="list" |
指定要安装的组件,多个组件用逗号分隔。必须与脚本中定义的组件名完全一致。 | setup.exe /COMPONENTS="core,help,plugins" |
/TASKS="list" |
指定要执行的任务,多个任务用逗号分隔。必须与脚本中定义的任务名完全一致。 | setup.exe /TASKS="desktopicon,associations" |
/VERYSILENT |
静默模式,不显示任何窗口或提示,不创建桌面快捷方式,安装完成后自动退出。 | setup.exe /VERYSILENT |
/SILENT |
静默模式,与 /VERYSILENT 类似,但会显示一个进度条窗口。 |
setup.exe /SILENT |
/SUPPRESSMSGBOXES |
抑制所有消息框,如果与 /SILENT 或 /VERYSILENT 一起使用,所有错误和警告都将被忽略。 |
setup.exe /VERYSILENT /SUPPRESSMSGBOXES |
/NORESTART |
安装完成后不自动重启,即使需要重启,安装程序也会退出而不会重启。 | setup.exe /VERYSILENT /NORESTART |
/LOG="file" |
将安装日志输出到指定的文件中,这对于排查安装失败问题非常有用。 | setup.exe /VERYSILENT /LOG="C:\install.log" |
/LOADINF="file" |
从指定的 .inf 文件加载安装设置。.inf 文件通常是由安装程序在之前生成的。 |
setup.exe /LOADINF="C:\settings.inf" |
如何处理自定义参数
定义了参数后,你需要在脚本中通过代码来读取和处理这些参数,Inno Setup 提供了 ParamStr 和 ParamCount 函数来实现这一点。

(图片来源网络,侵删)
ParamCount: 返回命令行参数的总数(包括程序名本身)。ParamStr: 获取指定的命令行参数。ParamStr(0)返回安装程序自身的路径("C:\Downloads\setup.exe")。ParamStr(1)返回第一个参数,以此类推。
示例:处理自定义参数
假设你的脚本定义了以下参数:
Parameters="/config /license:"C:\licenses\mykey.txt" /mode:enterprise"
你可以在 [Code] 段落中这样处理它们:
[Code]
// 在安装前执行的函数
function InitializeSetup(): Boolean;
var
i: Integer;
Param, Value: String;
begin
Result := True; // 默认允许安装继续
// 遍历所有参数 (从 1 开始,跳过程序名)
for i := 1 to ParamCount do
begin
Param := ParamStr(i);
// 检查是否是 /config 开关
if CompareText(Param, '/config') = 0 then
begin
MsgBox('检测到 /config 参数,将使用默认配置。', mbInformation, MB_OK);
// 在这里执行相关逻辑,例如设置一个全局变量
g_UseDefaultConfig := True;
end;
// 检查是否是 /license 参数
if Pos('/license:', Param) = 1 then
begin
Value := Copy(Param, 10, Length(Param) - 9); // 提取 "C:\licenses\mykey.txt"
if FileExists(Value) then
begin
MsgBox('检测到许可证文件: ' + Value, mbInformation, MB_OK);
// 在这里读取许可证文件内容或设置路径
g_LicenseFile := Value;
end
else
begin
MsgBox('错误:指定的许可证文件不存在: ' + Value, mbError, MB_OK);
Result := False; // 阻止安装继续
end;
end;
// 检查是否是 /mode 参数
if Pos('/mode:', Param) = 1 then
begin
Value := Copy(Param, 7, Length(Param) - 6);
if CompareText(Value, 'enterprise') = 0 then
begin
MsgBox('检测到企业版模式,将启用高级功能。', mbInformation, MB_OK);
// 设置一个全局变量,在后续的 [Components] 或 [Tasks] 中使用
g_IsEnterpriseEdition := True;
end;
end;
end;
end;
综合实战示例
这个例子将展示如何结合内置参数和自定义参数来创建一个灵活的自动化安装脚本。
脚本文件 (MyApp.iss)
#define MyAppName "My Awesome Application"
#define MyAppVersion "1.5"
[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
DefaultDirName={autopf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputDir=Output
OutputBaseFilename=setup_v{#MyAppVersion}
Compression=lzma
SolidCompression=yes
; 定义自定义参数
Parameters="/license /config:"C:\deploy\config.ini" /env:prod"
; 定义组件
[Components]
Name: "core"; Description: "核心程序"; Types: full compact;
Name: "help"; Description: "帮助文档"; Types: full;
Name: "plugins"; Description: "插件"; Types: full; Flags: disablenouninstallcheck;
; 定义任务
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}";
Name: "associations"; Description: "创建文件关联"; GroupDescription: "{cm:AdditionalIcons}";
[Code]
var
g_LicenseFile: String;
g_ConfigFile: String;
g_Environment: String;
function InitializeSetup(): Boolean;
var
i: Integer;
Param, Value: String;
begin
Result := True;
for i := 1 to ParamCount do
begin
Param := ParamStr(i);
if Pos('/license:', Param) = 1 then
begin
g_LicenseFile := Copy(Param, 10, Length(Param) - 9);
if not FileExists(g_LicenseFile) then
begin
MsgBox('许可证文件不存在: ' + g_LicenseFile, mbError, MB_OK);
Result := False;
Exit;
end;
end;
if Pos('/config:', Param) = 1 then
begin
g_ConfigFile := Copy(Param, 9, Length(Param) - 8);
end;
if Pos('/env:', Param) = 1 then
begin
g_Environment := Copy(Param, 6, Length(Param) - 5);
end;
end;
end;
// 在安装过程中使用这些变量
function ShouldComponentInstall(const Component: String): Boolean;
begin
// 在生产环境中不安装帮助文档
if (CompareText(g_Environment, 'prod') = 0) and (CompareText(Component, 'help') = 0) then
begin
Result := False;
end
else
begin
Result := True;
end;
end;
命令行调用示例
开发人员本地测试,完整安装,创建桌面快捷方式。
setup.exe /DIR="C:\Dev\MyApp" /TYPE=normal /TASKS="desktopicon,associations"
服务器自动化部署,静默安装,只安装核心组件,不创建快捷方式,并记录日志。
setup.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /DIR="C:\Program Files\MyApp" /COMPONENTS="core" /LOG="C:\deploy\server_install.log" /license:"C:\deploy\license.txt" /config:"C:\deploy\config.ini" /env:prod
从设置文件恢复安装配置。
假设之前安装完成后,安装程序在 C:\Program Files\MyApp 目录下生成了一个 MyApp.iss.txt 文件,你可以用它来重复安装。
setup.exe /LOADINF="C:\Program Files\MyApp\MyApp.iss.txt"
最佳实践
- 文档化你的参数: 为你的自定义参数创建清晰的文档,说明每个参数的作用、格式和示例。
- 使用有意义的参数名: 如
/env:prod比/p更具可读性。 - 处理错误: 在
InitializeSetup中检查文件是否存在、参数格式是否正确等,并在出错时返回False以阻止安装。 - 利用日志: 在自动化部署中,始终使用
/LOG参数,如果安装失败,日志是排查问题的第一手资料。 - 区分大小写: Inno Setup 的自定义参数名不区分大小写 (
/MYPARAM和/mYpArAm是一样的),但内置参数通常是区分大小写的(建议统一使用大写)。 - 生成
.inf文件: 如果你的安装程序需要被多次使用相同的配置,可以在安装完成后提示用户保存设置,或使用代码自动生成一个.inf文件,供下次/LOADINF使用。
通过掌握这些安装参数,你可以让你的 Inno Setup 安装程序变得非常专业和强大,能够适应各种复杂的部署需求。
