使用可覆盖属性时如何按命令行卸载 MSI 包?

Posted

技术标签:

【中文标题】使用可覆盖属性时如何按命令行卸载 MSI 包?【英文标题】:How to uninstall a MSI-Package per commandline when using overridable properties? 【发布时间】:2014-12-01 07:46:47 【问题描述】:

我使用 WiX 3.8 制作了一个 MSI 包,其中包含一个名为“INSTALLLOCATION”的安装文件夹的属性。 通常 MSI 包由设置属性的 Bootstrapper-Bundle 调用。 在 MSI 中,该属性的定义如下:

<Property Id="INSTALLLOCATION"
          Value="ProgramFilesFolder"
          Hidden="no"/>

如您所见,ProgramFilesFolder 是默认值。 现在我们希望 - 与引导程序并行 - 有可能通过命令行安装 MSI 包。 所以我发送以下命令:

msiexec /i Setup.msi INSTALLLOCATION=C:\MyApplication

MSI 将安装在正确的位置。 到目前为止,一切顺利。

但是当我尝试通过 ControlPanel/Programs 或命令行卸载它时,它不起作用,因为默认值“ProgramFilesFolder”。 即使我尝试以下命令:

msiexec /u Setup.msi INSTALLLOCATION=C:\MyApplication

我该怎么做才能卸载?

【问题讨论】:

请扩展“它不起作用”。没有明确的理由为什么不知道 INSTALLLOCATION 会导致卸载失败,除非您有一些依赖它的代码(自定义操作?)不需要告诉 Windows 文件的安装位置。 【参考方案1】:

这是我的错! RemoveFolder-entry 是错误的。 当您使用这样的目录层次结构时

<Directory Id="TARGETDIR"
           Name="SourceDir">
  <Directory Id="ProgramFilesFolder">
    <Directory Id="INSTALLLOCATION"
               Name="InstallLocation">
      <Directory Id="CompanyFolder"
                 Name="MyCompany">
        <Directory Id="INSTALLDIR"
                   Name="MyApp" />
      </Directory>
    </Directory>
  </Directory>

必须是:

<RemoveFolder Id="INSTALLDIR"
              On="uninstall"/>

就是这样。

【讨论】:

以上是关于使用可覆盖属性时如何按命令行卸载 MSI 包?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 WiX 和 MSI 进行静默安装和卸载?

从命令行上传时如何覆盖pypi包?

如何使用命令行卸载 Apache

MSI 软件包的静默安装

从 MSI 安装程序的命令行覆盖“文本框”对话框字段(Visual Studio 2010 Web 设置)

使用 installshield 从命令行卸载