【问题标题】:MSI installing file inside a folder which contains in its name the substring %Path%?MSI 在文件夹中安装文件,该文件夹的名称中包含子字符串 %Path%?
【发布时间】:2015-03-06 16:08:10
【问题描述】:

我遇到了一个构建 MSI 包的项目。该包中的一个文件夹具有以下名称:

%P_%F_%Path%alfa

在安装时,在 InstallFiles 标准操作期间,Windows Installer 会将子字符串 %Path% 解析为环境变量,因此字符 ':' 出现在文件夹名称中,并且出现安装错误 (文件夹名称中的字符无效)。

EDITDuplicateFiles 标准操作也会出现同样的错误。

如果我创建了一个将这个文件夹创建为空的 MSI(即在 CreateFolders 标准操作期间)Windows Installer 不会尝试将子字符串 %Path% 解析为环境变量并且安装成功,创建具有上述名称的文件夹。

我以前从未遇到过这种情况。还有人做过吗?如果是,您能否详细说明到底发生了什么以及是否有可用的解决方法?

注意!我添加了不同 MSI 创作工具的所有标签,因为我怀疑这是与工具无关的情况。

【问题讨论】:

  • “格式化”的文档表明您可以通过将 % 编码为 [\%] 来转义它,这似乎在我有限的测试中有效。
  • 确实,formatted 支持这样的转义字符。但是目录表没有格式化的列,有效的文件夹名称中不接受 '\' 字符。 msdn.microsoft.com/en-us/library/aa368295%28v=vs.85%29.aspx
  • 当然明白,但如果 InstallFiles 在您的路径解析中应用格式化规则,那么值得一试看看它是否会应用 [] 规则。
  • 我试过了,修改了目录表中的行,但安装程序在成本计算操作期间出错,抱怨路径无效。好吧,这似乎只是我们必须忍受的另一个 WI 错误。感谢所有的反馈家伙(克里斯托弗,菲尔)
  • MSI 就是这样。 IMO,尽管如此,它仍然是最好的框架/范例。

标签: wix installshield windows-installer advanced-installer


【解决方案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 元素的文件夹工作。

【讨论】:

    【解决方案2】:

    禁止的文件夹名称:很有趣,各种特殊性。 这不是一个答案,而是更多关于 MSI 文件夹名称特性的指针。您是否知道不能在 Windows 资源管理器中创建具有以下任何名称的文件夹名称? con, prn, nul, aux?列表继续从lpt0lpt9com0com9

    设备参考:这都是遗留原因。您不能创建具有“系统操作”或“设备”引用的文件夹。这些名称是旧设备和遗留概念。在路径名称之前识别设备名称。 CON 是控制台设备,AUX 是辅助设备,PRN 是打印机,还有LPR&lt;digit&gt;COM&lt;digit&gt; 指的是 com 端口。还有其他的。请注意,这些名称忽略了文件扩展名,因此 CON.EXEcon.txt 仍然意味着控制台。

    工具处理:我相信您仍然可以使用 Win32 API 调用甚至使用命令提示符创建此类文件夹,但它们不是 Windows 资源管理器。顺便说一句,Advanced InstallerInstallshield 似乎允许它们作为 MSI 文件夹名称,但是在安装时会出现运行时错误 - 或者在 MSI 启动时收到文件夹名称无效的警告.我理解不希望在工具中添加代码以禁止此类文件夹的愿望-当您开始防止此类事情发生时,总会出现新的错误-我猜人们应该知道这些文件夹。实际上编译时警告会很棒 - 只是要检查的非法文件夹名称列表和非法字符序列。当您不知道是什么原因时发现它肯定是一个奇怪的问题。


    一些链接

    来源(我从其中一些中复制了很多,因此应将它们列出以供参考):

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-05
      • 2018-12-29
      • 2017-08-16
      • 2016-07-02
      • 2017-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多