我正在开发我的第一个基于WiX的安装程序,我需要确保在安装之前没有设置特定的环境变量。这是为了确保我正在安装的客户端的另一个实例没有安装在不同的路径下(它使用的GUID与我使用的GUID不同。)
该客户端也没有设置任何注册表项,也没有要检查的已知路径。
提前感谢您的帮助。
编辑:所以我尝试了两种不同的方法,但都不起作用。
第一种方法(方法2被注释掉了。)我在<Product>
元素中有这个XML。
<?ifdef env.MY_VAR ?>
<Condition Message="MY_VAR already defined.">0</Condition>
<?endif?>
不幸的是,无论%MY_VAR%是否设置,这似乎总是评估为true,并显示消息,安装程序优雅地退出(正如我所希望的那样)
第二种方法。(方法1被注释掉了)我在<Product>
元素中有这个XML。<Condition Message="Error: MY_VAR environment variable already set."><![CDATA[MYVAR <> ""]]></Condition>
我还在产品中引用的<Fragment>
中定义了<CustomAction>
,如下所示:<CustomAction Id="GetMyVar" Property="MYVAR" Value="[%MY_VAR]" />
其中该CCD_ 10在CCD_<Custom Action="GetTNSAdmin" After="LaunchConditions" />
这也导致了我在第一种方法中看到的"总是评估为真实"的行为。
我做错了什么?
您的第一种方法失败了,因为ifdef是一个编译时指令,很像C/C++预处理器的ifdef。它在运行时对您没有帮助。
不确定第二种方法是如何处理CDATA块。不过你已经接近了:
<Condition Message="An important environment variable is already defined.">
NOT %IMPORTANT_ENV_VAR
</Condition>
正如PhilDW所说,您需要在环境变量之前加一个%,并添加NOT条件。请记住,如果条件为FALSE,则会显示该消息。
点击此处了解发布条件。
根据以下条件语句构建启动条件:
http://msdn.microsoft.com/en-us/library/aa368012(v=vs.85).aspx
所以看起来NOT%ENVNAME的条件应该有效。
您可以在ComponentSearch:中使用其他安装的组件guid
http://wixtoolset.org/documentation/manual/v3/xsd/wix/componentsearch.html
这些并不关心路径——它只会告诉您是否安装了组件guid。