在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)
通常,当属性用作基于属性的文件夹时,会发生这种情况。在这种情况下,CostFinalize 操作会自动将该属性设置为有效路径(例如“C:\”),以便 Windows Installer 可以使用该文件夹。
由于此路径是自动生成的,因此您无法确定它在所有客户端计算机上都是“C:\”,因此您不应在您的情况下使用此值。相反,你可以尝试这个:
例如,如果您的搜索是 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)