MSI在文件夹中安装文件,其名称中包含子串%%Path%?

时间:2015-03-06 16:08:11

标签: wix windows-installer installshield msiexec advanced-installer

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

  

%P_%F_%路径%的阿尔法

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

编辑 DuplicateFiles 标准操作也会出现同样的错误。

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

我以前从未遇到过这种情况。还有其他人吗?如果是,您能否详细说明具体情况以及是否有可用的解决方法?

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

2 个答案:

答案 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资源管理器中无法使用以下任何名称创建文件夹名称? conprnnulaux?该列表会继续lpt0lpt9com0com9

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

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

一些链接

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

相关问题