Wix MSI正在文件夹中安装文件,该文件夹的名称中包含子字符串%Path%?
我遇到了一个构建MSI包的项目。该包中的一个文件夹具有以下名称: %p_u%F_%Path%alfa 在安装时,在标准操作期间,Windows Installer将把子字符串%Path%解析为环境变量,因此字符“:”将出现在文件夹名称中,安装错误将被清除(文件夹名称中的字符无效) 编辑:重复文件的标准操作也会出现相同的错误 如果我创建了一个将此文件夹创建为空的MSI(即在CreateFolders标准操作期间),Windows Installer不会尝试将子字符串%Path%解析为环境变量,并且安装成功,将创建具有上述名称的文件夹 我以前从未遇到过这种情况。还有其他人吗?如果是的话,您能否提供更多关于具体情况的详细信息,以及是否有解决办法Wix MSI正在文件夹中安装文件,该文件夹的名称中包含子字符串%Path%?,wix,installshield,windows-installer,advanced-installer,Wix,Installshield,Windows Installer,Advanced Installer,我遇到了一个构建MSI包的项目。该包中的一个文件夹具有以下名称: %p_u%F_%Path%alfa 在安装时,在标准操作期间,Windows Installer将把子字符串%Path%解析为环境变量,因此字符“:”将出现在文件夹名称中,安装错误将被清除(文件夹名称中的字符无效) 编辑:重复文件的标准操作也会出现相同的错误 如果我创建了一个将此文件夹创建为空的MSI(即在CreateFolders标准操作期间),Windows Installer不会尝试将子字符串%Path%解析为环境变量,并且
注意!我添加了不同MSI创作工具的所有标记,因为我怀疑这是一种与工具无关的情况。我可以使用WiX和IsWiX进行确认。IsWiX创建了一个文件夹,其中包含以下文件:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="MergeRedirectFolder">
<Directory Id="owd6248671CA393CCC018715A2FB53AD2D6" Name="%P_%F_%Path%alfa">
<Component Id="owcA59F51CBEAEE88B00B715AF4FEE6BF72" Guid="1619af96-1b2b-64ea-91f5-1a297c3c636a">
<File Id="owfA59F51CBEAEE88B00B715AF4FEE6BF72" Source="$(var.SourceDir)\test.txt" KeyPath="yes" />
</Component>
</Directory>
</Directory>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="MergeRedirectFolder">
<Directory Id="owd6248671CA393CCC018715A2FB53AD2D6" Name="%P_%F_%Path%alfa">
<Component Id="owc6248671CA393CCC018715A2FB53AD2D6" Guid="071c27cb-0566-40b1-9a50-5672b3fbd5e1">
<CreateFolder />
</Component>
</Directory>
</Directory>
</Directory>
IsWiX创建一个空文件夹,如下所示:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="MergeRedirectFolder">
<Directory Id="owd6248671CA393CCC018715A2FB53AD2D6" Name="%P_%F_%Path%alfa">
<Component Id="owcA59F51CBEAEE88B00B715AF4FEE6BF72" Guid="1619af96-1b2b-64ea-91f5-1a297c3c636a">
<File Id="owfA59F51CBEAEE88B00B715AF4FEE6BF72" Source="$(var.SourceDir)\test.txt" KeyPath="yes" />
</Component>
</Directory>
</Directory>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="MergeRedirectFolder">
<Directory Id="owd6248671CA393CCC018715A2FB53AD2D6" Name="%P_%F_%Path%alfa">
<Component Id="owc6248671CA393CCC018715A2FB53AD2D6" Guid="071c27cb-0566-40b1-9a50-5672b3fbd5e1">
<CreateFolder />
</Component>
</Directory>
</Directory>
</Directory>
这两种方法都可以创建可编译并通过验证的MSI,但是当带有CreateFolder元素的文件夹工作时,带有文件的文件夹会给出您描述的错误。禁止的文件夹名称:有趣的是,各种特殊性。这与其说是一个答案,不如说是对MSI文件夹名称特性的进一步说明。您知道不能在Windows资源管理器中使用以下任何名称创建文件夹名称吗<代码>con,prn
,nul
,aux
?该列表依次为lpt0
到lpt9
和com0
到com9
设备引用:这一切都是出于传统原因。无法创建具有“系统操作”或“设备”引用的文件夹。这些名称是旧设备和旧概念。在路径名之前识别设备名CON
是控制台设备,AUX
是辅助设备,PRN
是打印机,还有LPR
<代码>COM指的是COM端口。还有其他的。请注意,这些名称忽略了文件扩展名,因此CON.EXE
或CON.txt
仍然表示控制台
工具处理:我相信您仍然可以使用Win32 API调用甚至命令提示符创建此类文件夹,但它们不是Windows资源管理器中允许的有效Windows名称。顺便说一句,Advanced Installer和Installshield似乎允许将它们作为MSI文件夹名称,但在安装时会出现运行时错误,或者在MSI启动时会收到文件夹名称无效的警告。我理解不想在工具中添加代码来禁止这些文件夹的愿望——当你开始防范类似的事情时,总会有新的bug——我想人们应该知道这些文件夹。实际上,一个编译时警告会很好——只是一个要检查的非法文件夹名称列表,以及非法字符序列。当你不知道是什么导致它的时候,发现它确实是一个奇怪的问题
某些链接:
- (超级用户)
- (库拉)
- (微软社区)
- (超级用户)