WIX预安装检查:如果文件夹已存在

时间:2014-02-03 09:49:24

标签: xml wix windows-installer

我是WIX TOOLSET的新手,并且正在玩它。尝试编程和安装程序,但卡在某一点,我需要在安装之前预先搜索,如果存在某些文件/文件夹,如果是,则继续停止该过程。但我无法找到明确的解决方案。这是我的代码。

<Property Id="CHECKPREINSTALLATION">
  <DirectorySearch Path="[ProgramsFilesFolder]"
                   Depth="0"
                   AssignToProperty="no"
                   Id="ProgramFilesFolderSearch">
    <DirectorySearch Path="Notepad"
                     Depth="0"
                     AssignToProperty="no"
                     Id="ComprionFolderSearch">
      <DirectorySearch Path="plugin"
                       Depth="0"
                       AssignToProperty="no"
                       Id="DeviceTestCenterFolderSearch">

      </DirectorySearch>
    </DirectorySearch>
  </DirectorySearch>
</Property>




<Condition Message="Installation requires PLUGIN. Please make sure it is installed."> NOT CHECKPREINSTALLATION</Condition>

如果有人可以就正确的方法提出一些建议,那将会很棒。

2 个答案:

答案 0 :(得分:1)

根据我的经验,DirectorySearch的Path属性非常挑剔。 首先应使用System Folders之类的内容,然后仅添加路径而不是嵌套的DirectorySearch标记。因此,根据您的情况:

Path="[ProgramFilesFolder]Notepad\plugin"

接下来,您可以预定义属性值。如果找到文件夹,则值将更改为它的地址,因此您可以根据此条件进行设置。 完整代码:

<Property Id="CHECKPREINSTALLATION" Value="NOTEXIST" >
      <DirectorySearch Id="ProgramFilesFolderSearch" Depth="0" Path="[ProgramFilesFolder]Notepad\plugin" >
      </DirectorySearch>
    </Property>

    <Condition Message="Installation requires PLUGIN. Please make sure it is installed.">
      <![CDATA[CHECKPREINSTALLATION<>"NOTEXIST"]]>
    </Condition>

如果要选择两个文件夹之间的路径(例如我),只需使用Double DirectorySearch。属性中将使用最新的现有文件夹的地址,如下所示:

<Property Id="CHECKPREINSTALLATION"  >
      <DirectorySearch Id="ProgramFilesFolderSearch" Depth="0" Path="[ProgramFilesFolder]Notepad\folderA" >
      </DirectorySearch>
 <DirectorySearch Id="ProgramFilesFolderSearch2" Depth="0" Path="[ProgramFilesFolder]Notepad\folderB" >
      </DirectorySearch>
    </Property>

我知道这是一个古老的问题,不会帮助作者,但是我一直在寻找可靠的答案,但找不到答案。

答案 1 :(得分:-1)

看起来您正在进行文件搜索以确定是否已安装某些内容。如果某个东西是由MSI产品安装的,那么还有其他方法可以搜索它(例如,组件guid,有时候是注册表搜索)。或者,该文件可能是您可以运行的标准可再发行组件的一部分,无论如何它都会做正确的事情。

另一件事是在Program Files文件夹中搜索是棘手的,因为在x64机器上有两个,一个用于32位,另一个用于64位,因此存在混淆的空间。此外,当某人安装产品时,他们可以选择安装文件夹,因此无法保证Program Files是正确的查找位置。

编辑添加: 我在这里没有得到什么。您的安装程序将文件安装到该程序文件文件夹。但您的问题是您的安装如何检测以前的版本或之前放在那里的文件夹?这意味着你正在进行某种类型的升级,此时我会因为升级工作而丢失 - 如果文件已经存在,则会根据版本规则进行更新。另一方面,如果您要安装一个完全不同的产品而不是升级,您只需要搜索该文件的组件guid,它将告诉您它是否存在。无论哪种方式,我都不知道如何回答这个问题,因为如果我的分析是正确的,那么你就不需要搜索了。无论哪种方式,文件搜索都可以工作,如果找到文件,他们会设置属性,如果您进行安装并创建日志,您将看到正在进行的操作以及是否正在设置属性。如果它是您想要的文件,则执行文件搜索而不是目录搜索,如果它存在重要的文件。