[好的是,这一事实真的很容易确定地进行分析:或者,msi软件包确实未安装在系统上,或者您做错了什么。当然正确的调用是:
我正在尝试自动卸载使用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 guide,WiX 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>
“ 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的软件包,或者输入错误。
要验证故障所在:
首先尝试右键单击(可能是)已安装的.msi文件本身。您将看到(除了“安装”和“修复”之外)一个卸载条目。点击那个。a)如果该卸载有效,则您的msi拥有另一个与您期望的产品代码不同的产品(也许您使用了错误的WiX源,或者您的版本具有动态日志记录,其中产品代码发生了更改)。b)如果该卸载给出相同的“ ...仅对已安装的产品有效”,则表示未安装该软件包(显然,这是能够卸载它的前提条件)。
如果是1.a),如果使用Orca,Insted或其他编辑器/工具打开msi文件,则可以查找软件包的正确ProductCode。只是谷歌为他们。在名称为“ Property”的表中查找,并在第一列中搜索字符串“ ProductCode”。在第二列中有正确的值。
没有其他可能性。
只是对所用命令行的建议:我将至少为简单的进度栏或“ / qn”参数添加“ / qb”(后者用于完全静默卸载,但是只有在确定它可以工作的情况下才有意义) 。
msiexec.exe /x "{588A9A11-1E20-4B91-8817-2D36ACBBBF9F}" /q
没有理由使{}命令不起作用。半显而易见的问题是:
您确定已实际安装产品! 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
[好的是,这一事实真的很容易确定地进行分析:或者,msi软件包确实未安装在系统上,或者您做错了什么。当然正确的调用是:
msiexec.exe /x "{588A9A11-1E20-4B91-8817-2D36ACBBBF9F}" /q
没有理由使{}命令不起作用。半显而易见的问题是:
感谢大家的帮助-原来是WiX问题。
您最后需要/ q
尝试此命令