Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wix 在msi(wxs)中安装时提取环境变量_Wix_Windows Installer - Fatal编程技术网

Wix 在msi(wxs)中安装时提取环境变量

Wix 在msi(wxs)中安装时提取环境变量,wix,windows-installer,Wix,Windows Installer,我的想法是提取环境变量ZEN_HOME的值,并在安装时将其分配给变量MyInstallDir,如果未设置,则使用其他值ProgramFileFolder设置该变量 我面临的错误是,wxs在编译时搜索值,而不是在安装时 如何确保值是在安装时提取的,而不是在编译时提取的 <?if %ZEN_HOME% != "" ?> <?define MyInstallDir = %ZEN_HOME% ?> <?else?> <?define MyInst

我的想法是提取环境变量ZEN_HOME的值,并在安装时将其分配给变量MyInstallDir,如果未设置,则使用其他值ProgramFileFolder设置该变量

我面临的错误是,wxs在编译时搜索值,而不是在安装时

如何确保值是在安装时提取的,而不是在编译时提取的

<?if %ZEN_HOME% != "" ?>
    <?define MyInstallDir = %ZEN_HOME% ?>
<?else?>
    <?define MyInstallDir="ProgramFilesFolder" ?>
<?endif?>

正如您正确提到的那样,您尝试执行的操作将在预处理期间在编译时执行。您不能在安装时利用WiX变量-这完全是WiX自定义概念,Windows Installer对此一无所知

因此,如果我正确理解您的意图,您将把应用程序的安装目录设置为环境变量的某个值(如果它在目标机器上)。否则,请返回到“程序文件”下的文件夹

你可以用下面的方法来处理它。 首先,定义类似以下内容的目录结构:

<Directory Id="TARGETDIR" Name="SourceDir">
   <Directory Id="ProgramFilesFolder">
      <Directory Id="INSTALLLOCATION" Name="MySetupProject">
         ...
      </Directory>
    </Directory>
</Directory>
这将成为一种退路。稍后,定义自定义操作以设置INSTALLLOCATION,以防定义了环境变量:

<SetProperty Id="INSTALLLOCATION" Value="[%ZEN_HOME]" After="CostFinalize">[%ZEN_HOME]</SetProperty>

您应该在之后安排它,以便能够将目录作为属性进行寻址。

您尝试执行的操作将在编译时执行,正如您正确提到的,在预处理期间。您不能在安装时利用WiX变量-这完全是WiX自定义概念,Windows Installer对此一无所知

因此,如果我正确理解您的意图,您将把应用程序的安装目录设置为环境变量的某个值(如果它在目标机器上)。否则,请返回到“程序文件”下的文件夹

你可以用下面的方法来处理它。 首先,定义类似以下内容的目录结构:

<Directory Id="TARGETDIR" Name="SourceDir">
   <Directory Id="ProgramFilesFolder">
      <Directory Id="INSTALLLOCATION" Name="MySetupProject">
         ...
      </Directory>
    </Directory>
</Directory>
这将成为一种退路。稍后,定义自定义操作以设置INSTALLLOCATION,以防定义了环境变量:

<SetProperty Id="INSTALLLOCATION" Value="[%ZEN_HOME]" After="CostFinalize">[%ZEN_HOME]</SetProperty>

您应该在之后安排它,以便能够将目录作为属性进行寻址。

Ahh..非常感谢。wxs末端已经有一条既有线路:我要把它移走吗?我对msi的概念非常陌生,基本上是一个Linux的家伙,但是我们的产品有Linux和Windows版本,这就是问题的原因。或者你想让我添加Well,actually元素只是一对set-a-property自定义动作定义元素的快捷方式,并将其调度到安装序列元素中。我认为您应该首先了解名为SetInstallationDirectory的现有自定义操作的功能,然后根据需要调整它,或者添加一个新操作(如果完全是出于其他目的)。如果没有看到SetInstallationDirectory自定义操作的定义,很难理解…啊..我明白了。所以我在这里附加了禅宗家。我希望这就是你想要设定的,对吗?是的,这就是想法。正如我在回答中提到的那样,确保它被正确地安排在成本确定之后。啊……非常感谢。wxs末端已经有一条既有线路:我要把它移走吗?我对msi的概念非常陌生,基本上是一个Linux的家伙,但是我们的产品有Linux和Windows版本,这就是问题的原因。或者你想让我添加Well,actually元素只是一对set-a-property自定义动作定义元素的快捷方式,并将其调度到安装序列元素中。我认为您应该首先了解名为SetInstallationDirectory的现有自定义操作的功能,然后根据需要调整它,或者添加一个新操作(如果完全是出于其他目的)。如果没有看到SetInstallationDirectory自定义操作的定义,很难理解…啊..我明白了。所以我在这里附加了禅宗家。我希望这就是你想要设定的,对吗?是的,这就是想法。正如我在回答中提到的那样,确保它被正确地安排在成本最终确定之后。