如何使用不带.msi文件的产品ID guid使用msiexec进行卸载

问题描述 投票:26回答:7

我正在尝试自动卸载使用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文件是否为必需文件,如果不是,那么为什么在给定GUID的情况下Windows安装程序似乎会认为是该文件?

。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>
wix windows-installer uninstall msiexec
7个回答
34
投票

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


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

如果收到“ 此操作仅对当前安装的产品有效

”,则说明您使用了无法识别的产品或软件包代码,因此必须找到正确的代码。通常,这可能是由于使用错误的程序包代码而不是产品代码卸载而引起的-每次重新编译MSI文件时,程序包代码都会更改,这是您在查看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


旧版,注册表选项

您也可以通过以下基本键中的registry

查找产品代码HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Uninstall。按F3键并搜索您的产品名称。 (如果它是64位计算机上的32位安装程序,则可能位于HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall下。)>

Legacy,PowerShell选项 :(与上述新的链接的答案基本相似)

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

get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name

<< img src =“ https://image.soinside.com/eyJ1cmwiOiAiaHR0cHM6Ly9pLnN0YWNrLmltZ3VyLmNvbS9OUGluTS5wbmcifQ==” alt =“在此处输入图像描述”>

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

[好的是,这一事实真的很容易确定地进行分析:或者,msi软件包确实未安装在系统上,或者您做错了什么。当然正确的调用是:

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

((当然需要管理员权限-这里使用大括号不带引号-仅在命令行中指定了带有空白的路径或值时,才需要引号。)如果消息为:“此操作仅对当前安装的产品有效”,则为true。尚未安装带有此ProductCode的软件包,或者输入错误。

要验证故障所在:

  1. 首先尝试右键单击(可能是)已安装的.msi文件本身。您将看到(除了“安装”和“修复”之外)一个卸载条目。点击那个。a)如果该卸载有效,则您的msi拥有另一个与您期望的产品代码不同的产品(也许您使用了错误的WiX源,或者您的版本具有动态日志记录,其中产品代码发生了更改)。b)如果该卸载给出相同的“ ...仅对已安装的产品有效”,则表示未安装该软件包(显然,这是能够卸载它的前提条件)。

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

  3. 没有其他可能性。

    只是对所用命令行的建议:我将至少为简单的进度栏或“ / qn”参数添加“ / qb”(后者用于完全静默卸载,但是只有在确定它可以工作的情况下才有意义) 。

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

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

  1. 您确定已实际安装产品! ARP /程序和功能中有某些内容。

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

  • 如果\ windows \ installer目录已损坏,则高速缓存的文件将丢失,该文件用于卸载。

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

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

    一旦我将GUID更改为'*'以自动生成,就会出现ProductCode,并且在其他答案确认的语法下,它们都可以正常工作。

    您最后需要/ q

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

    尝试此命令

    msiexec /x {product-id} /qr
    

    4
    投票

    [好的是,这一事实真的很容易确定地进行分析:或者,msi软件包确实未安装在系统上,或者您做错了什么。当然正确的调用是:


    3
    投票
    msiexec.exe /x "{588A9A11-1E20-4B91-8817-2D36ACBBBF9F}" /q 
    

    2
    投票

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


    1
    投票

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


    0
    投票

    您最后需要/ q


    0
    投票

    尝试此命令

    © www.soinside.com 2019 - 2024. All rights reserved.