正如您正确提到的,在预处理期间,您尝试执行的操作将在编译时执行。您不能在安装时利用 WiX 变量 - 它完全是 WiX 自定义概念,Windows Installer 对此一无所知。
因此,如果我正确理解您的意图,您将应用程序的安装目录设置为环境变量的某个值(如果它在目标计算机上)。否则,回退到 Program Files 下的文件夹。
您可以通过以下方式接近它。首先,定义类似这样的目录结构:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder">
<Directory Id="INSTALLLOCATION" Name="MySetupProject">
...
</Directory>
</Directory>
</Directory>
这将作为后备。稍后,定义一个set-a-property自定义操作来设置 INSTALLLOCATION,以防定义了环境变量:
<SetProperty Id="INSTALLLOCATION" Value="[%ZEN_HOME]" After="CostFinalize">[%ZEN_HOME]</SetProperty>
您应该在CostFinalize之后安排它,以便能够将目录寻址为属性。