在安装时检测目录的存在

Bri*_*pie 6 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>
Run Code Online (Sandbox Code Playgroud)

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

当目录不存在时,IS_INSTALLED似乎设置为"C:\".

是这样的条件:

<Condition>NOT (IS_INSTALLED = "C:\")</Condition>
Run Code Online (Sandbox Code Playgroud)

检测目录被找到的可靠方法?有没有更好的办法?

答:这是基于我接受的mrnxs答案的 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>
Run Code Online (Sandbox Code Playgroud)

Cos*_*rvu 4

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

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

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

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

您可以使用这种方式进行调节:

IS_INSTALLED
Run Code Online (Sandbox Code Playgroud)

或者

NOT IS_INSTALLED
Run Code Online (Sandbox Code Playgroud)