WiX安装程序FileSearch具有完整文件路径

时间:2014-06-18 01:56:56

标签: wix installer windows-installer

我正在使用WiX创建MSI,并且MSI接受用户输入属性,即安装程序逻辑将使用的文件名的路径。我尝试通过确定该文件是否存在来验证该属性,但是使用完整的文件路径,我无法弄清楚如何与DirectorySearchFileSearch合作图案。

所以,说用户运行MSI就像: msiexec /i myinstaller.msi CUSTOMFILE="C:\test\input.txt"

然后我需要运行类似的东西:

<Property Id="CUSTOMFILEEXISTS">
  <DirectorySearch 
    Id="LocationConfigDirSearch" 
    Path="[CUSTOMFILE_DIR]" Depth="0">

    <FileSearch Name="[CUSTOMFILE_FILENAME]"></FileSearch>
  </DirectorySearch>
</Property>

但我:

  1. 无法弄清楚如何将文件名拆分为其部分。像Path.GetDirectory([CUSTOMFILE])Path.GetFileName([CUSTOMFILE])这样的东西是理想的。或;
  2. 无法按原样确定如何使用完整文件名确定文件是否存在。例如,DirectorySearchIgnoreFileName="true"的{​​{1}}属性,但我知道这样的属性不存在。
  3. 我是否需要编写扩展代码或自定义操作?我希望这是一个足够简单的要求,它不需要走得那么远。

3 个答案:

答案 0 :(得分:1)

FileSearch element是Windows Installer中Signature table的抽象。 FileName列不支持Formatted数据类型,因此您无法在该属性中添加属性。

您可以做的是标准化固定文件名并让用户提供具有目录路径的属性,而不是文件路径。然后,我认为您可以使用AppSearch在该目录中查找文件,而无需编写自定义操作。

否则,在没有任何状态变化的情况下进行简单发现的自定义操作并不是世界上最糟糕的事情。请注意不要引入任何托管脆弱性。 Windows Installer中的ActiveScript(VB / JScript)支持非常脆弱。我发现C#/ DTF管理的自定义操作可以接受,但不是每个人都可以。这留下了C / C ++,它可以非常可靠但更难编码。这是一个简单的CA,所以它应该非常简单。

答案 1 :(得分:0)

检查不对目标系统进行任何更改实际上可以通过自定义操作VBScript 执行。只要没有系统更改,就不需要回滚功能,并且脚本实际上通常比复杂的文件搜索机制更容易使用。只需确保脚本简单,并对其进行测试。

我想到的一个问题是这个文本文件中的内容,以及它是如何为安装会话指定的。你只是在命令行上传递它,还是有一个浏览对话框来指定路径?

这是一个来自脚本存储库的简单检查文件脚本:

Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists("C:\FSO\ScriptLog.txt") Then
    Set objFolder = objFSO.GetFile("C:\FSO\ScriptLog.txt")
Else
    'Wscript.Echo "File does not exist."
End If

请注意,我不认为您可以在VBScript自定义操作中调用Wscript。但是,您可以在即时模式下访问MSI文件Session object。延迟模式访问比explained here更难,但这超出了您指定用途的范围。

答案 2 :(得分:0)

无需运行自定义操作来显式搜索系统,无论使用何种语言,另一种选择是编写代码以在正在运行的MSI文件中创建自己的AppSearch。密钥将文件添加到DrLocator表中的Path表。你当然可以在AppSearch之前做到这一点。

我认为文件必须具有固定名称并且位于某个位置(如MSI文件旁边或用户的AppDataFolder中),然后您可以为特定文件执行AppSearch,这不是什么大问题。基于[SourceDir]或[AppDataFolder]

这是静默安装吗?有没有理由不能添加自定义对话框来浏览文件?

相关问题