Steamworks 文献库
创建和使用 InstallScripts

概览

Steam 可自动安装多种常见可再发行文件,但您的应用程序可能会有其他首次运行的要求。
备注:下文所述的安装脚本功能基本上只适用 Windows 操作系统。 支持 MacOS 的功能仅限文件权限与符号链接。 目前尚无支持 Linux 或 SteamOS 的安装脚本功能。

安装脚本文件为配置文件,使您在安装时能够运行某些操作。

完整的游戏/应用程序及 DLC 程序包都可能拥有各自的安装脚本。 如果您将安装脚本集成进生成版本,安装脚本的数量将不受限制。 对于 SteamPlay 应用,我们建议您永远将安装脚本放入各操作系统专用的 Depot 中。

示例

以下为一个基础脚本示例:
"InstallScript" { "Registry" { "HKEY_LOCAL_MACHINE\\SOFTWARE\\Foo\\Bar" { "string" { "Install_Path" "%INSTALLDIR%" "Exe_Path" "%INSTALLDIR%\\foobar.exe" } "dword" { "PatchVersion" "12" } } } "Run Process" { "DirectX" { "HasRunKey" "HKEY_LOCAL_MACHINE\\Software\\Valve\\Steam\\Apps\\480" "Process 1" "%INSTALLDIR%\\DirectX\\DXSETUP.exe" "Command 1" "/silent" "NoCleanUp" "1" } } }

根目录后的第二个键名描述了即将发生的操作。

注意: 所有键名与值皆可使用转义序列,因此如果您想使用\,请改用\\

将安装脚本集成进生成版本

首先,安装脚本文件必须包含在与生成版本同时安装的 Depot 中。 请注意该文件应在应用程序或 Depot 事先定义的 ContentRoot 中。

其次,在 Depot 生成版本脚本中使用 InstallScript 指令标记安装脚本。 示例请见上传至 Steam – 高级生成版本脚本

在生成版本的过程中,会发生以下两件事:
  • 安装脚本上传至 Steam 并加密签署。 在执行任何安装脚本前,Steam 将验证此签名,并且在执行某些操作时也需要验证签名,包括写入 Windows 中的 HKLM 配置单元。 此举可能造成您的安装脚本的本地副本被修改。
  • 安装脚本在 Depot 清单中被标记。 您可以在生成的 manifest.txt 文件中看到 Flags 字段标记为 100
当 Steam 用户启动游戏时,Steam 将扫描所有已装载的该游戏的 Depot,搜寻任何含有安装脚本标志的文件并运行。

Registry(注册表)

“Registry”命令允许您创建或修改“string”和“dword”的注册表值。 任何在键名“Registry”下的键都将被视为您想创建或开启的注册表键的完整路径。 在该键下,请指明“string”或“dword”键的内容。 任何存储于“string”或“dword”键下的键名和值都将被设为注册表中的名称与值。
如想设置某一注册表键的默认值,请将键名设为 (Default)

Run Process(运行进程)

“Run Process”命令允许您的应用程序在用户首次启动游戏前运行一些程序。
安装脚本会先查看 HasRunKey 值中的键名(为注册表 dword 值),以决定是否需要运行某程序。 如果该值不存在或为 0,安装脚本将针对 process xx/commandxx 的值调用 CreateProcess。 如果 CreateProcess 失败,则调用 ShellExecuteEx。 如果该程序的 ExitCode 为 0,那么安装脚本会将其视为运行成功,在注册表中将您的键名写为 1。

Steam 顾客都喜欢快速安静的安装过程。 建议您向所有 Run Process 命令添加静默或安静的参数,并只添加您的游戏绝对需要的内容。
以下为必要的 Run Process 键/值:
  • Process 1 - 想启动程序的路径
以下为可选的 Run Process 键/值:
  • Command 1 - 您想传给程序的可选命令。
  • HasRunKey - 可选的注册表键,检查“prereq”是否已安装。
  • NoCleanUp - 可选标志,设置后,当您的应用从 Steam 中删除时,安装脚本将不会删除键名。
  • MinimumHasRunValue - 可选,设置在决定是否启动程序时安装脚本应检查的最小值。
  • Requirement_OS - 可选键,作用是应用 OS 的特定要求。 请见 OS 特定要求,了解更多详情。
  • AsCurrentUser - 可选标志,如果以当前用户身份运行对该程序非常重要,则设置为 1。 否则,Steam 客户端可能将其作为管理员运行,以避免大屏幕或 VR 环境下的提升权限提示。

防火墙例外

如果您的游戏使用网络,请使用防火墙例外在 Windows 中自动授予防火墙例外,而无需强制用户接受例外。
"Firewall" { "Space War Game" "%INSTALLDIR%\\SpaceWar.exe" }

OS 特定要求

Requirement_OS 值可用于在不同 OS 版本/SKUs 中运行不同的安装程序, 但需要名为 Requirement_OS 的新键组,其中包含额外的键/值对。 下面列出了可用的 OS 选项。
  • Is64BitWindows - 指定进程只运行操作系统的 64 位版本。 值为 1 或 0。
  • OSType - 指定进程只运行操作系统的特定版本。 值为:
    • Windows 3.11
    • Windows 95
    • Windows 98
    • Windows ME
    • Windows NT
    • Windows 2000
    • Windows XP
    • Windows 2003
    • Windows Vista
    • Windows 7
    • Windows 2008
    • Windows 2012
    • Windows 2012 R2
    • Windows 8
    • Windows 8.1
    • Windows 10

64 位示例
此示例会为 32 位或 64 位操作系统运行正确的安装程序。
"Net32" { "Process 1" "%INSTALLDIR%\\redist\\Controller\\32bitInstaller.exe" "NoCleanUp" "1" "Requirement_OS" { "Is64BitWindows" "0" } } "Net64" { "Process 1" "%INSTALLDIR%\\redist\\Controller\\64bitInstaller.exe" "NoCleanUp" "1" "Requirement_OS" { "Is64BitWindows" "1" } }

OS 类型示例
此示例仅在 Windows XP 上运行。

"Controller" { "Process 1" "%INSTALLDIR%\\redist\\WinXPInstaller.exe" "NoCleanUp" "1" "Requirement_OS" { "OSType" "Windows XP" } }

环境变量

安装脚本支持环境变量。 所有 Windows 上可用的标准环境变量均可使用,安装脚本特定的其他环境变量也可以使用。 这些环境变量包括:
  • %INSTALLDIR% - 应用程序安装位置的完整路径,不含反斜杠。
  • %ROOTDRIVE% - 应用程序安装位置的驱动器号,如 C
  • %APPDATA% - \Users\username\AppData\ 文件夹。
  • %USER_MYDOCS% - 获取 user\My Documents 文件夹。
  • %COMMON_MYDOCS% - 获取 All Users\Documents 文件夹。
  • %LOCALAPPDATA% - \Documents and Settings\username\Local Settings\Application Data 文件夹(只用于 Vista 或更新版本)。
  • %WinDir% - Windows 安装目录。
  • %STEAMPATH% - Steam 客户端安装目录的完整路径。

请注意,这些是通用路径,但是根据用户所运行的 Windows 版本可能会有所不同。

语言特定值

视用户运行 Steam 时使用的语言,可为字符串和 DWORD 值分配不同的数据。 在“string”或“dword”中创建用语言名字命名的子项,然后在子项中分配名称和值,即可使用。 例如:
"InstallScript" { "Registry" { "HKEY_LOCAL_MACHINE\\SOFTWARE\\MonkeyDime Studios\\Killer Banana Peel" { "dword" { "english" { "Language" "1" } "french" { "Language" "2" } "german" { "Language" "3" } "italian" { "Language" "4" } "spanish" { "Language" "5" } } } } }

安装脚本从 Steam 的注册表项查询“language”值,获得语言。 如果未找到该值,默认情况下则使用“english”。

卸载应用

用户在 Steam 上删除或验证您的应用时,安装脚本会被调用,以移除其创建的所有注册表项。 安装脚本也会移除用于确定程序是否应从 Run Process 执行的值,以便下次您的应用运行时执行(除非 NoCleanUp 标志已设置)。

卸载时的运行进程

如果您需要在卸载您的应用时运行任何进程,请将其添加至安装脚本。 请勿卸载常见可再发行文件,如 DirectX、msvc 运行时等,因为其他游戏有可能会用到这些可再发行文件。 这只针对游戏特定的卸载进程。

"InstallScript" { "Run Process On Uninstall" { "Process_name" { "Process 1" "process.exe" "Command 1" "/command" } } }

常见问题

问:为什么每次我启动游戏时,安装脚本总是运行我的可再发行文件?
答: 这通常意味着可再发行文件返回了非零返回代码。 Steam 会检查返回代码是否为零。 如果返回代码为零,则 Steam 会将可再发行文件标记为已安装,不会再次运行。 如果返回任何其他值,Steam 会在下次启动时尝试再次运行。

要修复此问题,请检查您的可再发行文件路径和参数。 如果电脑中已经存在可再发行文件,则会返回非零值。 通常可以通过使用可再发行文件的静默或安静标记,来解决此问题。

问:为什么我的注册表键未被写入?
答: 这通常是因为未签署安装脚本,而您写入了 HKLM。
请参见将安装脚本集成进生成版本一节,并确保“kvsignatures”键已在生成过程中添加至您的脚本,因为 Steam 需要此签名完成后才能写入 HKLM。

这也可能是由 64 位 Windows 上的 Windows 64 位虚拟化所导致,因此 Steam 写入了注册表中的 Wow6432Node 路径。

问:为什么我的安装脚本似乎根本就没有运行?
答: 请仔细检查您的配置是否正确。

问:该如何添加 macOS 可再发行文件? 为什么我的 macOS 安装脚本中的运行进程不工作?
答: 我们目前不支持安装 Mac 可再发行文件。 您需要将安装程序放至主可执行文件中。