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