如何使用没有.msi文件的产品ID guid与msiexec一起卸载

时间:2014-01-31 23:00:10

标签: wix windows-installer uninstall msiexec

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

如果我跑:

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

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

我明白了:

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

如果我跑: 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>

7 个答案:

答案 0 :(得分:31)

  

“参考样式”答案 :这是下面一个的替代答案,显示了几个不同的选项。的 Uninstalling an MSI file from the command line without using msiexec


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

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


更新,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

enter image description here

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

答案 1 :(得分:3)

好处是,这个很容易且确定性地分析: 要么,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”。在第二列中有正确的值。

  3. 没有其他可能性。

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

答案 2 :(得分:2)

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

  1. 您确定该产品已实际安装! ARP /程序和功能中有一些东西。

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

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

答案 3 :(得分:1)

msiexec.exe / x“{588A9A11-1E20-4B91-8817-2D36ACBBBF9F}”/ q

答案 4 :(得分:0)

感谢大家的帮助 - 结果证明这是一个WiX问题。

当产品ID GUID明确显示时在问题中硬编码,生成的.msi没有ProductCode属性,而是在使用orca检查时产品ID属性。

一旦我将GUID更改为'*'以自动生成,ProductCode就显示出来了,所有工作正常,其他答案确认了语法。

答案 5 :(得分:0)

你最后需要/ q

... | filter {}

答案 6 :(得分:0)

尝试此命令 msiexec / x {product-id} / qr