使用 'if exist' 在 Wix 中执行 CustomAction
Executing a CustomAction in Wix with 'if exist'
您好,我想在安装我的程序时执行以下 CustomAction:
<!--Include the custom action for overwrite Client.config-->
<CustomAction Id="SetCmdLineParams" Property="QtExecCA" Value='if exist "[CURRENTDIRECTORY]\Client.config" ("xcopy" /Y "[CURRENTDIRECTORY]\Client.config" "[INSTALLFOLDER]")' Execute="immediate" />
<CustomAction Id="QtExecCA" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no"/>
<!--Include the InstallExecuteSequence for overwrite Client.config-->
<InstallExecuteSequence>
<Custom Action="SetCmdLineParams" After="CostFinalize"/>
<Custom Action="QtExecCA" Before="InstallFinalize" />
</InstallExecuteSequence>
不幸的是,这不起作用,因为:CAQuietExec:命令字符串必须以引用的应用程序名称开头。
但是如果我引用"if exist",那么这个命令就不起作用了。我现在可以做什么?
if exist 是 cmd.exe 的一个特征。您需要先说 cmd /c 或创建一个 .bat 文件并调用它。
老实说,这是非常脆弱的代码。对于一个 CURRENTDIR 并不总是如您所想的那样。您应该编写一个 C++ 或 C# 自定义操作,使用 OriginalDatabase 属性 获取 MSI 运行 的位置,并从那里复制配置文件。
我过去非常成功地使用的另一种方法是编写一个实用程序,通过将用户提供的配置文件嵌入其中来转换种子 MSI。现在部署故事被简化了。
您好,我想在安装我的程序时执行以下 CustomAction:
<!--Include the custom action for overwrite Client.config-->
<CustomAction Id="SetCmdLineParams" Property="QtExecCA" Value='if exist "[CURRENTDIRECTORY]\Client.config" ("xcopy" /Y "[CURRENTDIRECTORY]\Client.config" "[INSTALLFOLDER]")' Execute="immediate" />
<CustomAction Id="QtExecCA" BinaryKey="WixCA" DllEntry="CAQuietExec" Execute="deferred" Return="check" Impersonate="no"/>
<!--Include the InstallExecuteSequence for overwrite Client.config-->
<InstallExecuteSequence>
<Custom Action="SetCmdLineParams" After="CostFinalize"/>
<Custom Action="QtExecCA" Before="InstallFinalize" />
</InstallExecuteSequence>
不幸的是,这不起作用,因为:CAQuietExec:命令字符串必须以引用的应用程序名称开头。
但是如果我引用"if exist",那么这个命令就不起作用了。我现在可以做什么?
if exist 是 cmd.exe 的一个特征。您需要先说 cmd /c 或创建一个 .bat 文件并调用它。
老实说,这是非常脆弱的代码。对于一个 CURRENTDIR 并不总是如您所想的那样。您应该编写一个 C++ 或 C# 自定义操作,使用 OriginalDatabase 属性 获取 MSI 运行 的位置,并从那里复制配置文件。
我过去非常成功地使用的另一种方法是编写一个实用程序,通过将用户提供的配置文件嵌入其中来转换种子 MSI。现在部署故事被简化了。