更改 WiX 的 INSTALLFOLDER 值

Posted

技术标签:

【中文标题】更改 WiX 的 INSTALLFOLDER 值【英文标题】:change the INSTALLFOLDER value of WiX 【发布时间】:2014-03-02 12:22:26 【问题描述】:

我正在使用自定义的 WiXUI_InstallDir UI 进行软件安装。在浏览对话框中,我们甚至可以选择 C:\ 作为安装目录。有没有什么可能的方式,当用户选择 C:\ 时,它会自动在其中添加一个文件夹名称?例如如果 Software 是 XYZ 软件,那么在浏览到 C:\ 并按 OK 后,它应该在 pathedit 中显示 c:\XYZ。

【问题讨论】:

您是否希望为每个根目录(C:\、D:\、E:\..etc)、仅 C:\ 或每个选定的目录(即 XYZ 软件即使用户选择“C:\Program Files\XYZ”也添加?) 其实我的优先级只针对C:\、D:\等,默认安装目录是C:\Program Files\XYZ。如果用户选择任何根目录,那么它应该附加 XYZ。 【参考方案1】:

这一年来,我偶尔会有客户要求这样做,但我总是拒绝他们。这不是标准的 Windows Installer 做法。基本上,您试图防​​止白痴选择错误的目录。这实际上是不可能的,因为他们可以选择许多愚蠢的地方来放置软件。如果您真的不太信任您的用户,请放弃选择并始终转到 [ProgramFilesFolder]My Company\My Product。

【讨论】:

【参考方案2】:

我倾向于同意 Chris,放弃选择并选择标准安装目录。您可以避免各种问题,并且您的软件更符合标准。

更改安装目录的概念可以看作是一种反模式,或者是几年前磁盘空间稀缺且人们到处安装时糟糕的安装程序设计的残余。软件安装应该更加标准化,并且可以选择我将安装锁定到 [ProgramFilesFolder]My Company\My Product,就像 Chris 建议的那样。

在某些情况下,您可能希望将软件安装在记忆棒或类似介质上。在这些情况下,更好的选择是允许直接进行特殊安装 - 换句话说,它是一个独立的应用程序,没有注册表依赖项。很少有应用程序安装程序支持这一点 - 我看到的最后一个是 Opera 一些版本。完全不同的概念,但比仅通过更改安装路径来允许非标准安装更有意义。

【讨论】:

小型 SSD 磁盘的普及使得这个观点比以前稍微复杂了一些,但我仍然不喜欢非标准的安装位置。我更喜欢另一个(辅助)安装位置的系统范围声明。请记住,如果您取出包含新辅助位置的辅助磁盘,这将如何中断。没有简单的修复。 清理 SSD 空间的一些建议short versionlong version【参考方案3】:

尽管我同意软件应安装在 Program Files 下,但我正在编写的代码与您描述的一样。在这段代码中,如果用户选择C:\,它将被安装到C:\Program Files\XYZ。如果选择了另一个根文件夹,它将被安装到,比如D:\XYZ。如果您愿意,可以进一步扩展此代码。

假设您的目录结构为

<Directory Id="TARGETDIR" Name="SOURCEDIR">
<Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLLOCATION" Name="XYZ" />
</Directory>
</Directory>

代码使用PathEditUI控件

<Control
Id="customPathEdit"
Type="PathEdit"
Property="TARGETDIR"
Fixed="Yes"
Remote="Yes"
X="10"
Y="10"
Width="100"
Height="17">

<Publish
    Property="INSTALLLOCATION"
    Value="[ProgramFilesFolder]XYZ\"
    Order="1"
    <![CDATA[TARGETDIR << %SYSTEMDRIVE]]>
</Publish>

<Publish
    Property="INSTALLLOCATION"
    Value="[TARGETDIR]XYZ\"
    Order="2"
    <![CDATA[NOT (TARGETDIR << %SYSTEMDRIVE)]]>
</Publish>


</Control>

当然,我们需要一个PushButton 控件来提醒安装程序路径已更改:

<Control
Id="OkButton"
Type="PushButton"
Height="17"
Width="56"
x="50"
Y="70"
Text="OK">

    <Publish
    Event="SetTargetPath"
    Value="INSTALLLOCATION"
    Order="1">1</Publish>

            <!--Another publish element is required to go to the next dialog-->
</Control>

仅当用户选择了%SYSTEMDRIVE 时,第一个发布元素才将属性INSTALLLOCATION 设置为路径[ProgramFilesFolder]XYZ\。仅当用户未选择 %SYSTEMDRIVE 时才使用第二个发布元素。最后一个发布元素调用SetTargetPath 事件将新的安装路径保存到安装会话。

【讨论】:

您没有考虑静默安装或想要安装到 X:\Program Files 的人。

以上是关于更改 WiX 的 INSTALLFOLDER 值的主要内容,如果未能解决你的问题,请参考以下文章

如何在WIX中创建自定义默认安装文件夹?

Wix 设置自定义事件不提示管理员权限

将动态属性传递给延迟的自定义操作 WIX

文件未使用WIX和WAX复制到安装目录

我可以在 WIX 中定义变量后更改它吗

如何使用 WiX 安装程序更改添加/删除程序名称?