我正在开发我的第一个基于WiX的安装程序,我需要确保在安装之前未设置特定的环境变量。这是为了确保我正在安装的客户端的另一个实例尚未安装在不同的路径下(它不使用与我使用的相同的GUID。)
此客户端也不设置任何注册表项,也没有已知的检查路径。
提前感谢您的帮助。
编辑: 所以我尝试了两种不同的方法,但都没有效果。
第一种方法(方法2被注释掉了。)我在<Product>
元素内部有这个XML。
<?ifdef env.MY_VAR ?>
<Condition Message="MY_VAR already defined.">0</Condition>
<?endif?>
不幸的是,这似乎总是评估为true,无论%MY_VAR%是否设置,并且显示消息,并且安装程序正常退出(正如我所希望的那样)。
第二种方法。 (方法1注释掉了),我在<Product>
元素内部有这个XML。
<Condition Message="Error: MY_VAR environment variable already set."><![CDATA[MYVAR <> ""]]></Condition>
我还在产品中引用的<CustomAction>
内定义<Fragment>
,如下所示:
<CustomAction Id="GetMyVar" Property="MYVAR" Value="[%MY_VAR]" />
在<CustomAction>
元素内对<InstallExecuteSequence>
进行排序:
<Custom Action="GetTNSAdmin" After="LaunchConditions" />
这也导致我在第一种方法中看到的“总是评估为真”的行为。
我做错了什么?
答案 0 :(得分:2)
请记住,Wix是声明性的。您试图将程序代码与Wix的声明性质相结合。 你会度过一段美好的时光。
你的第一个方法失败了,因为ifdef是一个编译时指令,很像C / C ++预处理器的ifdef。它在运行时不会帮助你。
不确定您的第二种方法是尝试使用CDATA块。你关闭了:
<Condition Message="An important environment variable is already defined.">
NOT %IMPORTANT_ENV_VAR
</Condition>
正如PhilDW所说,你需要在环境变量之前加一个%并添加NOT条件。请记住,如果条件为 FALSE ,则会显示该消息。
在这里阅读launch conditions。
答案 1 :(得分:1)
启动条件是根据这些条件语句构建的:
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。