0

我用 WiX 创建了一个 MSI 安装程序。我专门针对 Windows XP SP3+ 它在安装完成时运行自定义操作,以通过 NSSM.exe 将应用程序注册为服务 从命令行运行时批处理文件执行其编写的操作,但作为一部分运行时安装程序完成安装我看到命令提示符打开并且脚本运行,但应用程序未注册。

    <CustomAction Id="installLoft"
              Directory="ModulesFolder"
              ExeCommand="[ModulesFolder]winInstall.cmd"
              Execute="deferred"
              Return="check"
              HideTarget="no"
              Impersonate="no" />
<InstallExecuteSequence>
  <Custom Action="installLoft" Before="InstallFinalize"><![CDATA[ (NOT Installed) AND (NOT REMOVE) ]]></Custom>
</InstallExecuteSequence>

批处理脚本内容为:

@ECHO OFF
SET PATH=%PATH%;%APPDATA%\app1\
IF "%ProgramFiles(x86)%"=="" (
    set PATH=%PATH%;%ProgramFiles%\app1\
) ELSE (
    set PATH=%PATH%;%ProgramFiles(x86)%\app1\
)
"app1\modules\bin\nssm.exe" install my_service_name_app1 app1.cmd -g

因此,app1 是一个需要作为服务运行的脚本,因此需要将 NSSM.exe 所有组件/文件安装在正确的位置。

是否有一些我遗漏的 Win XP 警告?使用运行安装程序的同一用户手动运行批处理,服务已注册。

谢谢你的帮助。

4

2 回答 2

0

这真的在运行吗?尝试添加暂停命令,以便您可以看到它。我的经验表明 Windows Installer 在启动自定义操作时使用 CreateProcess 而不是 ShellExecute。这可以防止 UAC 提示,但也意味着它无法处理文件关联,并且必须启动 exe 进程而不是 .cmd 文件等文档文件。

于 2012-07-26T11:45:15.777 回答
0

我已经想通了。我发现在 Win XP 中注册服务时,它是在本地系统(或系统)用户下注册的。但是 SYSTEM 用户没有设置 APPDATA 环境变量。发生的事情是,我的脚本会尝试启动服务并且会因为未定义 APPDATA 而静默失败。

我声明/定义了一个自定义的 MYAPPDATA 系统级环境变量,现在当安装程序完成时 - 重新启动后 - 服务已启动并正在运行。

希望这可以帮助其他依赖标准环境变量的人。

于 2012-07-26T17:15:27.540 回答