互联网上的许多页面和有关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}}定义任何TARGETDIR
或ROOTDIR
属性,在任何情况下都没有MSI表!
因此,必须有另一个评估规则。哪一个?谁能解释奇怪的行为?
编辑
借助Stein,我仔细查看了日志,发现C:\
实际上指向更大的本地磁盘,但是由于系统文件夹属性< / strong>始终将其安装在系统驱动器上的正确位置。我在询问问题时还查看的日志文件是Dell Data Protection的日志文件,该日志文件明确必须将ROOTDRIVE
设置为ROOTDRIVE
或系统驱动器。因此,来自MSDN的C:\
规则似乎是正确的,但在大多数情况下它没有任何作用。
当我自己查看问题计算机时,我看到Y:是网络驱动器,然后我搜索了单词ADMIN etvoilà:这是一个管理安装,尽管我的客户告诉我他只是双击了MSI和Y:是一个本地驱动器=>我今年对节日的不满是,一个人应该永远不要不相信客户所说的并发誓;-)
答案 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和目录解析。在目标计算机统一的公司环境中,许多实际的硬代码ROOTDRIVE
到C:\
-不太好,但确实如此。他们不会这样做,除非他们试图避免按照您所描述的方式产生一些随机的副作用。
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>
某些链接 :