【问题标题】:Pass command-line arguments to WiX custom action将命令行参数传递给 WiX 自定义操作
【发布时间】:2019-02-26 18:14:26
【问题描述】:

我们通过 Windows 安装程序 (msi) 安装了一个桌面应用程序,我们希望添加一个自定义操作,当我们将 LAUNCH_APP=1 传递给 cmd 时重新启动 .exe。

所以我有一个 vbs 脚本,它启动一个启动安装 msi 的 bat 文件(主要升级):

vbs 脚本:

Set WshShell = CreateObject("WScript.Shell")
Const TemporaryFolder = 2
Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
Dim tempFolder: tempFolder = fso.GetSpecialFolder(TemporaryFolder)
WshShell.Run chr(34) & WScript.Arguments(0) & chr(34) & chr(32) & chr(34) & tempFolder & "\Lifen\update\LifenInstaller.msi" & chr(34) & chr(32) & chr(34) & WScript.Arguments(1) & chr(34), 0, True
Set WshShell = Nothing

bat 脚本:

@echo off 

call :start >%APPDATA%\Lifen\batMsiLog.log

:start
wmic process where "name='Lifen.exe'" delete
start /wait msiexec /i %1 /qn /norestart /log %APPDATA%\Lifen\msilog.log LAUNCH_APP=1

在我的 wix 安装程序(wix 版本 3.1.0)中有这个自定义操作:

<Property Id="WixQuietExecCmdLine" Value='"[INSTALLFOLDER]\Lifen.exe"'/>
<CustomAction Id="QtExecRestartApp" BinaryKey="WixCA" DllEntry="WixQuietExec" Execute="immediate" Return="check"/>
<InstallExecuteSequence>
  <Custom Action="QtExecRestartApp" After="InstallFinalize">LAUNCHAPP = 1</Custom>
</InstallExecuteSequence>

我不知道如何在自定义操作中添加参数(如 —new-version)以重新启动我的 exe。

最后,我想运行命令:

Lifen.exe —new-version

我尝试了各种写法:

  • '"[INSTALLFOLDER]\Lifen.exe --new-version=x.x.x"'
  • '"[INSTALLFOLDER]\Lifen.exe" "--new-version=x.x.x"'

或者在阅读此 * 之后:How to add arguments to the custom action exe in Wix?

  • '"&amp;quot;[#"[INSTALLFOLDER]\Lifen.exe"]"&amp;quot; "--new-version"'
  • '"&amp;quot;[#"[INSTALLFOLDER]\Lifen.exe"]"&amp;quot; "--new-version"'

有人有想法吗?

提前致谢

【问题讨论】:

    标签: wix exe command-line-arguments custom-action


    【解决方案1】:

    基本语法

    <Property Id="WixQuietExecCmdLine" Value='"[INSTALLFOLDER]Lifen.exe" --new-version'/> 
    
    • 您总是需要引用路径,因为它们可能包含空格。
    • 不需要像[INSTALLFOLDER] 这样的文件夹属性后的反斜杠,因为 MSI 运行时会确保所有安装文件夹属性的值都以反斜杠结尾。
    • 参数相同,如果可能包含空格,则需要引用。如果你有一个像--new-version 这样的常量参数,你确定没有空格,你不需要引用。对于包含属性引用的参数,总是引用更安全。例如:

      <Property Id="WixQuietExecCmdLine" Value='"[INSTALLFOLDER]Lifen.exe" "--new-version=[NEWVERSION]"'/> 
      

    如果您有疑问,请查看详细日志,看看WixQuietExecCmdLine 的实际值是否符合您的预期。通过调用 msiexec -l*v logfile.txt &lt;OtherParameters&gt; 激活详细日志记录。

    64 位可执行文件

    要运行 64 位可执行文件,请改用 WixQuietExec64 自定义操作和 WixQuietExec64CmdLine 属性。

    【讨论】:

    • 非常感谢您的回复。我尝试使用详细日志并按照您的指定尝试,但我可以在日志中看到:
    • 属性:WixQuietExecCmdLine = "[INSTALLFOLDER]Lifen.exe" --new-version 属性:WixShellExecTarget = "[INSTALLFOLDER]\Lifen.exe"
    • 第一行是 LAUNCH_APP 的特定自定义操作。第二行是安装后启动应用程序的另一个自定义操作。这是细节,我读了你所说的 \ 和写 [INSTALLFOLDER]Lifen.exe 但它没有改变任何东西。你还有其他想法为什么它不起作用?
    • @ValentineLanger 哦,好吧,我怎么没看到。当某个属性的值包含对其他属性的引用时,不能通过&lt;Property ...&gt;进行设置。从您的日志中可以看出,这不会解析属性引用。您需要改用&lt;SetProperty ...&gt;。请参阅documentation page 中的示例。我写的其他所有内容仍然适用。