我正在使用 WiX 创建 MSI,并且 MSI 接受作为用户输入属性的安装程序逻辑将使用的文件名的路径。我试图通过确定该文件是否存在来验证该属性,但是有了完整的文件路径,我无法弄清楚如何让它与 DirectorySearch
合作和 FileSearch
模式。
所以,假设用户像这样运行 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>
但是我:
- 不知道如何将文件名分成几个部分。类似于
Path.GetDirectory([CUSTOMFILE])
和Path.GetFileName([CUSTOMFILE])
会很理想。或者; - 无法弄清楚如何按原样使用完整文件名来确定文件是否存在。例如,
DirectorySearch
上的一个属性对于IgnoreFileName="true"
,但我知道这样的属性不存在。
我是否需要达到编写扩展代码或自定义操作的程度?我希望这是一个足够简单的要求,不需要走那么远。
最佳答案
FileSearch element是 Signature table 的抽象在 Windows 安装程序中。文件名列不支持 Formatted数据类型,因此您不能在该属性中放置属性。
您可以做的是标准化一个固定的文件名,并让用户提供一个包含目录路径而不是文件路径的属性。然后我认为您可以使用 AppSearch 在该目录中查找文件而无需编写自定义操作。
否则,在没有任何状态更改的情况下进行简单发现的自定义操作并不是世界上最糟糕的事情。请注意不要引入任何托管脆弱性。 Windows Installer 中的 ActiveScript (VB/JScript) 支持是出了名的脆弱。我发现 C#/DTF 管理的自定义操作是可以接受的,但不是每个人都接受。剩下的 C/C++ 可能非常可靠,但更难编码。这是一个简单的 CA,因此它应该非常简单。
关于具有完整文件路径的 WiX 安装程序文件搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24275966/