【问题标题】:How to uninstall with msiexec using product id guid without .msi file present如何在不存在 .msi 文件的情况下使用产品 ID guid 使用 msiexec 进行卸载
【发布时间】:2014-02-24 19:55:26
【问题描述】:

我正在尝试自动卸载使用 WiX 创建的软件包,以便在不重新配置整个操作系统的情况下更改已安装的软件堆栈和配置。最终我将使用 powershell 脚本来执行此操作,但目前我似乎无法让我的测试包与 cmd 交互卸载。

如果我跑:

msiexec /x '{A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}'

msiexec /x A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8

我明白了:

"安装包无法打开,请确认安装包 存在并且您可以访问它,或联系应用程序供应商 验证这是一个有效的 Windows 安装程序包。"

如果我运行: msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

我明白了:

“此操作仅对当前安装的产品有效”

我查看了windows installer guideWiX documentation、msiexec 文档并使用 orca 自己检查了 .msi,但我还没有真正找到任何可以清楚地了解卸载是如何处理的。是否需要 .msi 文件?如果不需要,为什么 Windows 安装程序在给定 GUID 时会认为它是必需的?

.msi 安装程序的 WiX 代码是:

<?xml version='1.0' encoding='windows-1252'?>
<Wix xmlns='htp://schemas.microsoft.com/wix/2006/wi' >

  <!--DO NOT COPY / PASTE THE PRODUCT ID GUID BELOW TO YOUR OWN WIX SOURCE -->

  <Product Id='A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8' Language='2057' 
           Manufacturer='COMPANYNAME IT-Operations' 
           Name='COMPANYNAMEServerListener' Version='1.0.0' 
           UpgradeCode='PUT-GUID-HERE'>

   <Package Id='*' Manufacturer='COMPANYNAME IT-Operations' Compressed='yes' />
   <Media Id='1' Cabinet='COMPANYNAMEServerListener.cab' EmbedCab='yes' />

    <Directory Id='TARGETDIR' Name='SourceDir'>
      <Directory Id='ProgramFilesFolder' Name='PFiles'>
      <Directory Id='COMPANYNAME' Name='COMPANYNAME'>
        <Directory Id='INSTALLDIR' Name='COMPANYNAMEServerListener'>
        <Component Id='MainExecutable' Guid='*' >
          <File Id='COMPANYNAMEServerListener.exe' 
                Source='COMPANYNAMEServerListener.exe' Vital='yes' 
                KeyPath='yes' />
          <ServiceInstall 
            Id='COMPANYNAMEServerListenerInstall'
            DisplayName='COMPANYNAMEServerListener'
            Description='Accepts and discards TCP connections on port 28028 to indicate that this server is alive and ready to be controlled'
            Name='COMPANYNAMEServerListener'
            Account='NT AUTHORITY\LocalService'
            ErrorControl='normal'
            Start='auto'
            Type='ownProcess'
            Vital='yes'           
          >
            <ServiceDependency Id='tcpip'/>
          </ServiceInstall>
          <ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="COMPANYNAMEServerListener" Wait="yes" />
        </Component>
        </Directory>
        </Directory>
      </Directory>
      </Directory>

    <Feature Id='Complete' Level='1' >
      <ComponentRef Id='MainExecutable' />
    </Feature>

    <CustomTable Id ="COMPANYNAMEMetadata">
      <Column Id="Property" Type="string" Category="Identifier" PrimaryKey="yes"/>
      <Column Id="Value" Type="string"/>
      <Row>
      <Data Column="Property">InstallString</Data>
      <Data Column="Value">/qn</Data>
      </Row>
    </CustomTable>


  </Product>
</Wix>

【问题讨论】:

  • 在引用 ID 时必须使用大括号是 100% 正确的。我没有大量使用 WiX 的经验,但我的印象是您所做的事情是正确的。如果您打开命令提示符并键入 rundll32 dfshim CleanOnlineAppCache 并重试,会发生什么?
  • 有关执行此操作的不同方法的一长串列表,请查看Uninstalling an MSI file from the command line without using msiexec

标签: wix installation uninstallation windows-installer


【解决方案1】:

试试这个命令

msiexec /x {product-id} /qr

【讨论】:

    【解决方案2】:
    msiexec.exe /x "{588A9A11-1E20-4B91-8817-2D36ACBBBF9F}" /q 
    

    【讨论】:

    • 您能否为您的答案提供更多背景信息?
    • 原因是您从 PowerShell 中调用它。 PowerShell 您需要引号,因此产品 id 被视为字符串。
    【解决方案3】:

    “Reference-Style”答案:这是以下答案的替代答案,其中显示了几个不同的选项。 Uninstalling an MSI file from the command line without using msiexec


    您指定的命令是正确的:msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}

    如果您收到“此操作仅对当前安装的产品有效”,则您使用了无法识别的产品或包代码,您必须找到正确的。这通常是由于使用错误的 包代码 而不是 产品代码 来卸载 - 包代码会随着 MSI 文件的每次重建而改变,并且是唯一的 guid您在查看 msi 文件的属性页时会看到。它应该适用于卸载,只要您使用正确的。没有出错的余地。如果您想查找产品代码,则需要打开 MSI。产品代码可在属性表中找到。


    2018 年 1 月更新

    随着所有注册表重定向的进行,我不确定以下基于注册表的方法是否可行。我没有正确检查,因为我现在使用 PowerShell 依赖以下方法:How can I find the product GUID of an installed MSI setup?

    另请查看此参考样式的答案,该答案描述了卸载 MSI 软件包的不同方法以及确定您已安装的产品版本的方法: Uninstalling an MSI file from the command line without using msiexec


    旧版,注册表选项

    您还可以通过浏览此基本密钥中的注册表找到产品代码HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall。按 F3 并搜索您的产品名称。 (如果是 64 位机器上的 32 位安装程序,它可能位于 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall 下)。

    旧版,PowerShell 选项:(与上面的新链接答案非常相似)

    最后,您可以使用 PowerShell 找到产品代码:

    get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name
    

    类似帖子:WiX - Doing a major upgrade on a multi instance install(如何在 MSI 中找到产品代码的屏幕截图)。

    【讨论】:

    • 最后一点:您绝不能在 MSI 文件中硬编码包代码以便在构建之间重用。这将强制 Windows Installer 根据定义将不同的 MSI 文件视为同一个文件 - 即使它们具有不同的内容 - 这会导致很多神秘的问题。
    • 我发现卸载键不可靠,但是 powershell 命令帮了大忙!但是有一个问题,即使输出到日志文件,长名称也会被截断……有没有办法让它显示整个名称?
    【解决方案4】:

    好消息是,这个分析真的很容易和确定性: 要么,系统上确实没有安装 msi 包,要么你做错了什么。 当然正确的调用是:

    msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}
    

    (当然需要管理员权限 - 此处使用不带任何引号的大括号 - 仅当在命令行中指定带空白的路径或值时才需要引号。)
    如果消息是:“此操作仅对当前安装的产品有效”,那么这是真的。带有此 ProductCode 的软件包未安装或存在拼写错误。

    验证故障在哪里:

    1. 首先尝试右键单击(可能)已安装的 .msi 文件本身。您将看到(除了“安装”和“修复”)一个卸载条目。点击那个。
      a) 如果该卸载有效,则您的 msi 的 ProductCode 超出您的预期(可能您的 WiX 源错误,或者您的构建具有 ProductCode 更改的动态日志记录)。
      b)如果该卸载给出相同的“......仅对已安装的产品有效”,则未安装该软件包(这显然是能够卸载它的先决条件)。

    2. 如果 1.a) 是这种情况,如果您使用 Orca、Insted 或其他编辑器/工具打开您的 msi 文件,您可以查找您的包的正确 ProductCode。只是谷歌他们。查看名称为“Property”的表并在第一列中搜索字符串“ProductCode”。在第二列中有正确的值。

    没有其他可能。

    只是对所用命令行的建议:我至少会为简单的进度条添加“/qb”或“/qn”参数(后者用于完全静默卸载,但只有在您确定它有效时才有意义)。

    【讨论】:

    • 小心使用 /q 或 /qn - 如果 msi 认为需要重新启动,它只会在没有提示或警告的情况下重新启动计算机。我会使用 /q /norestart
    【解决方案5】:

    最后需要 /q

    MsiExec.exe /x {2F808931-D235-4FC7-90CD-F8A890C97B2F} /q
    

    【讨论】:

      【解决方案6】:

      感谢大家的帮助 - 原来是 WiX 问题。

      当产品 ID GUID 像问题中那样保持显式和硬编码时,生成的 .msi 没有 ProductCode 属性,而是在使用 orca 检查时具有产品 ID 属性。

      一旦我将 GUID 更改为“*”以自动生成,ProductCode 就会显示出来,并且在其他答案确认的语法下一切正常。

      【讨论】:

      • 感谢分享修复程序 - WIX 的灵活性导致的另一个古怪问题。
      • 这没有任何意义,根据:stackoverflow.com/questions/10330534/… 和 Nick Ramirez WiX 3.6 A Developers Guide to WIX,产品 ID 属性是产品代码。我也无法在这里重现错误..
      【解决方案7】:

      {} 命令没有理由不起作用。半显而易见的问题是:

      1. 您确定该产品已实际安装! ARP/Programs&Features 中有一些东西。

      2. 原始安装实际上在当前上下文中可见。看起来它可能是按用户安装的,如果您现在以其他人的身份登录,那么它不会知道它 - 您需要使用与原始安装相同的帐户登录。

      3. 如果 \windows\installer 目录损坏,则缓存文件将丢失,用于卸载。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-01
        • 2010-09-24
        • 2011-07-01
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 2015-02-22
        相关资源
        最近更新 更多