在安装时检测目录的存在

时间:2011-02-08 19:54:31

标签: installer wix

在WiX中DirectorySearch可用于确定目标计算机上是否存在特定目录。但我不明白是否有一致的方法来确定目录不存在

例如:

<Property Id="INSTALLDIR" Secure="yes">
  <RegistrySearch Id='InstallDir' Type='directory'
    Root='HKLM' Key='Software\Company\Product\Install' Name='InstallPath'/>
</Property>
<Property Id='IS_INSTALLED' Secure='yes'>
  <DirectorySearch Id='IsInstalled' Path='[INSTALLDIR]' />
</Property>

当注册表项和目录都存在时,IS_INSTALLED属性将设置为DirectorySearch返回的路径。

当目录不存在时,IS_INSTALLED似乎设置为“C:\”。

是否像以下一样:

<Condition>NOT (IS_INSTALLED = "C:\")</Condition>

检测找到目录的可靠方法?还有更好的方法吗?

答案:以下是我接受的基于mrnxs answer的WiX代码

<Property Id="PRODUCT_IS_INSTALLED" Secure="yes">
  <RegistrySearch Id='RegistrySearch1' Type='directory'
    Root='HKLM' Key='Software\Company\Product\Version\Install' Name='Path'>
    <DirectorySearch Id='DirectorySearch1' Path='[PRODUCT_IS_INSTALLED]'/>
  </RegistrySearch>
</Property>

<CustomAction Id='SET_INSTALLDIR'
              Property='INSTALLDIR'
              Value='[PRODUCT_IS_INSTALLED]'/>

<InstallExecuteSequence>
  <Custom Action='SET_INSTALLDIR' After='AppSearch'></Custom>
</InstallExecuteSequence>

3 个答案:

答案 0 :(得分:4)

通常,当该属性用作基于属性的文件夹时会发生这种情况。在这种情况下,CostFinalize操作会自动将属性设置为有效路径(例如“C:\”),以便Windows Installer可以使用该文件夹。

由于此路径是自动生成的,因此您无法确定它在所有客户端计算机上都是“C:\”,因此您不应在您的条件中使用此值。相反,你可以试试这个:

  • 为您的文件夹使用自定义属性
  • 使用类型51 custom action(使用格式化文本设置的属性)将此属性设置为有效的默认路径(例如“[ProgramFilesFolder] MyCompany \ MyProduct”)
  • 使用其他媒体资源进行搜索
  • 使用其他类型51自定义操作将文件夹属性设置为搜索属性

例如,如果您的搜索是IS_INSTALLED,则您的文件夹可以使用IS_INSTALLED_PATH。 IS_INSTALLED_PATH可以设置为默认路径,在AppSearch操作后,如果搜索找到了某些内容,您可以将其设置为IS_INSTALLED。

这种方式可以用于调节:

IS_INSTALLED

NOT IS_INSTALLED

答案 1 :(得分:0)

了解AppSearch的RegLocator和DrLocator模式可能有点棘手。我建议暂时忽略该条件并记录安装以验证AppSearch是否正确设置了所需的属性。首先解决您在此问题上发现的问题。当它工作时,属性将被设置为注册表的值或目录的路径。

然后你应该可以使用:

<Condition>IS_INSTALLED/>   <!-- it's not important what the value is, just that it exists -->
<Condition>Not IS_INSTALLED/>
不过,我会避免使用属性INSTALLDIR。在我的安装程序(InstallShield)中,它具有特殊含义作为安装的主要焦点。

答案 2 :(得分:0)

另一种方法可能就是这样,如果要将InstallDir设置为其他任何位置,如果SystemDir和RegisteryDir不相同,则可以继续安装顺序

<Property Id="RegisteryDir" Secure="yes">
<RegistrySearch Id='InstallDir' Type='directory'
Root='HKLM' Key='Software\Company\Product\Install' Name='InstallPath'/>
</Property>
<Property Id='SystemDir' Secure='yes'>
<DirectorySearch Id='IsInstalled' Path='[RegisteryDir]' />
</Property>
<CustomAction Id="SET_INSTALL_DIR" Property="INSTALLDIR" Value="[SystemDir] />

<InstallExecuteSequence>
<Custom Action='SET_INSTALLDIR' After='AppSearch'>
SystemDir AND SystemDir=RegisteryDir
</Custom>
</InstallExecuteSequence>