Wix MSI正在文件夹中安装文件,该文件夹的名称中包含子字符串%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包的项目。该包中的一个文件夹具有以下名称:

%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 InstallerInstallshield似乎允许将它们作为MSI文件夹名称,但在安装时会出现运行时错误,或者在MSI启动时会收到文件夹名称无效的警告。我理解不想在工具中添加代码来禁止这些文件夹的愿望——当你开始防范类似的事情时,总会有新的bug——我想人们应该知道这些文件夹。实际上,一个编译时警告会很好——只是一个要检查的非法文件夹名称列表,以及非法字符序列。当你不知道是什么导致它的时候,发现它确实是一个奇怪的问题


某些链接

资料来源(我从其中一些资料中复制了大量资料,应将其列出以供参考):

  • (超级用户)
  • (库拉)
  • (微软社区)
  • (超级用户)

用于“格式化”的文档表明,您可以通过将%编码为[\%]来转义它,这在我有限的测试中似乎是可行的。事实上,格式化支持这样转义字符。但目录表没有格式化的列,有效的文件夹名称中不接受“\”字符。当然可以理解,但是如果InstallFiles在路径解析中应用了格式化规则,那么值得一试,看看它是否会应用[]规则。我尝试过,修改了目录表中的行,但安装程序在计算成本时出错,抱怨路径无效。好吧,看来这只是我们不得不忍受的另一个WI错误。感谢所有的反馈(克里斯托弗,菲尔)MSI就是这样。在我看来,这仍然是最好的框架/范例。