Windows Installer将ROOTDRIVE评估为具有较少可用内存空间的本地驱动器=>为什么?

时间:2018-09-28 18:28:29

标签: wix windows-installer

互联网上的许多页面和有关Windows Installer的书都引用了以下Microsoft页面ROOTDRIVE

  

如果未在命令行上设置ROOTDRIVE或未将其创建到“属性”表中,则安装程序将设置此属性。在进行管理性安装期间,安装程序会将ROOTDRIVE设置为它发现可以写入的第一个连接的网络驱动器。如果不是管理员安装,或者安装程序找不到网络驱动器,则安装程序将ROOTDRIVE设置为可写入具有最大可用空间 的本地驱动器

好吧,在我客户的计算机上,C:的可用空间比Y:多得多,但是应用程序安装到了Y:\MyApp而不是C:\Program Files (x86)\MyApp中。当然,WiX和Directory结构是标准样式:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLFOLDER" Name="$(var.CompanyName)">
      <Directory Id="MyAppFolder" Name="MyApp" />
    </Directory>
  </Directory>
</Directory>

所以没什么特别的。在其他计算机上,它会按预期安装到Program Files文件夹中。

根据我的日常经验,“最大可用空间” 的规则是不正确的,因为我要处理的许多计算机都具有相当小的SSD作为C:本地驱动器,比D:大得多的数据驱动器C:具有TB级的可用空间。如果该规则适用,那么当今大多数计算机会将(所有)应用程序安装到其数据驱动器的根目录(例如D:\)中,并且不在特殊保护的%ProgramFiles% / {{1 }}文件夹。在我所有配置相同的计算机上,小型SSD与大数据HDD具有更大的空间,所有内容都安装到了%ProgramFiles (x86)%中我期望的Program Files文件夹中。因此,“最大可用空间” 的规则肯定是不正确 !!!!而且,MSI并没有在命令行上为C:的{​​{1}}定义任何TARGETDIRROOTDIR属性,在任何情况下都没有MSI表!

因此,必须有另一个评估规则。哪一个?谁能解释奇怪的行为?

编辑

借助Stein,我仔细查看了日志,发现C:\实际上指向更大的本地磁盘,但是由于系统文件夹属性< / strong>始终将其安装在系统驱动器上的正确位置。我在询问问题时还查看的日志文件是Dell Data Protection的日志文件,该日志文件明确必须将ROOTDRIVE设置为ROOTDRIVE或系统驱动器。因此,来自MSDN的C:\规则似乎是正确的,但在大多数情况下它没有任何作用。

当我自己查看问题计算机时,我看到Y:是网络驱动器,然后我搜索了单词ADMIN etvoilà:这是一个管理安装,尽管我的客户告诉我他只是双击了MSI和Y:是一个本地驱动器=>我今年对节日的不满是,一个人应该永远不要不相信客户所说的并发誓;-)

1 个答案:

答案 0 :(得分:1)

系统文件夹属性 :我认为答案可以在此Symantec Article中找到。本质上: System Folder Properties不受ROOTDRIVE属性的影响

偶然地,我的D:\驱动器比我的C:\驱动器具有更多的空间,并且在MSI日志文件中ROOTDRIVE被设置为D:\。但是,安装过程不会将文件写入D:\。我认为这是由于 C:\ 上的可用空间?


更新:还要选中the documentation on TARGETDIR,重点关注此部分:

  

...如果定义了TARGETDIR属性,则为目标目录   解析为属性的值。如果TARGETDIR属性为   未定义,则使用ROOTDRIVE属性来解析路径。


问题计算机 :上面的内容并没有真正解释问题计算机上会发生什么,是吗?您是否曾经手动安装到此自定义位置?您是否使用"Remember Property" pattern来保留安装文件夹?它一定是在回溯那条旧路吗?还是磁盘空间不足?还是您正在使用管理映像进行安装? AdminProperties。那里没有设置媒体资源自定义操作? GUI中是否有可能会影响此的构造?我知道set属性用于WiX的默认GUI设置中。您可以将目录修改为“功能目录”。 See the screenshot down the page here

详细日志 :我建议您在安装转到辅助驱动器的系统上制作一个日志文件,并检查有关以下内容的日志内容一般是ROOTDRIVE和目录解析。在目标计算机统一的公司环境中,许多实际的硬代码ROOTDRIVEC:\-不太好,但确实如此。他们不会这样做,除非他们试图避免按照您所描述的方式产生一些随机的副作用。

Festivus Grievance:我一直不喜欢这个ROOTDRIVE问题,说实话从来没有完全理解它。换句话说,我听到了你的声音。事实上,这是我的Festivus对MSI的不满之一。我回答了吗并不是的 :-)。至少您有一些指针。也许 WiX专家克里斯·潘特(Chris Painter) PhilDW 可以提供完整的答案。


  

请勿使用以下结构:

<!--ROOTDRIVE explicitly set to prevent it from defaulting to drive with most space-->
<Property Id="ROOTDRIVE" Value="$(env.SystemDrive)" />

<!-- NO SOLUTION -->

以上内容将是编译时间分辨率,而不是文件夹的运行时分辨率。换句话说,这根本不是解决方案 。 ROOTDRIVE将设置为生成计算机的系统驱动器号,而不是您要安装到的计算机的系统驱动器号。

  

构造您可以尝试强制将ROOTDRIVE设置为系统驱动器:

<CustomAction Id='SetRootDrive' Property='ROOTDRIVE' Value='[%SystemDrive]\' />

<InstallUISequence>
  <Custom Action="SetRootDrive" Before="CostInitialize"></Custom>
</InstallUISequence>

某些链接