我遇到了一个构建MSI包的项目。该软件包中的一个文件夹具有以下名称:
%P_%F_%路径%的阿尔法
在安装时,在 InstallFiles 标准操作期间,Windows Installer会将子字符串%Path%解析为环境变量,因此字符':'出现在文件夹名称中并且安装错误输出(文件夹名称中的无效字符。)
编辑: DuplicateFiles 标准操作也会出现同样的错误。
如果我创建一个创建此文件夹的MSI为空(即在 CreateFolders 标准操作期间),Windows Installer不会尝试将子串%Path%解析为环境变量,并且安装成功,创建上面显示的名称的文件夹。
我以前从未遇到过这种情况。还有其他人吗?如果是,您能否详细说明具体情况以及是否有可用的解决方法?
注意!我添加了不同MSI创作工具的所有标签,因为我怀疑这是与工具无关的情况。
答案 0 :(得分:1)
我可以确认,使用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>
IsWiX创作了一个像这样的空文件夹:
<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元素的文件夹工作时给出您描述的错误。
答案 1 :(得分:1)
禁止的文件夹名称 :有趣,各种各样的小说。 这不是一个答案,而是对MSI文件夹名称特性的几个进一步指示。您是否知道在Windows资源管理器中无法使用以下任何名称创建文件夹名称? con
,prn
,nul
,aux
?该列表会继续lpt0
到lpt9
和com0
到com9
。
设备参考 :这是 遗留原因 的全部内容。您不能创建具有“系统操作”或“设备”引用的文件夹。这些名称是旧设备和遗留概念。在路径名称之前识别设备名称。 CON
是控制台设备,AUX
是辅助设备,PRN
是打印机,还有LPR<digit>
。 COM<digit>
指的是一个com端口。还有其他人。请注意,这些名称会忽略文件扩展名,因此CON.EXE
或con.txt
仍然代表控制台。
工具处理 :我相信您仍然可以使用Win32 API调用或甚至使用命令提示符创建此类文件夹,但它们不是 Windows资源管理器。顺便说一下,似乎高级安装程序和 Installshield 允许它们作为MSI文件夹名称,但是在安装时会出现运行时错误 - 或者您会收到一条警告,指出MSI启动时文件夹名称无效。我理解不想添加代码以禁止在工具中使用这些文件夹的愿望 - 当你开始防止这些文件时,总会出现新的错误 - 我猜想人们应该知道这些文件夹。实际上编译时警告会很棒 - 只是要检查的非法文件夹名称列表和非法字符序列。当你不知道是什么导致它时,发现这是一个奇怪的问题。
一些链接 :
来源(我从其中一些中复制了很多,应该列出它们以供参考):