我正在尝试自动卸载使用WiX创建的软件包,以便更改已安装的软件堆栈和配置,而无需重新配置整个操作系统 . 最终我将使用powershell脚本来执行此操作,但目前我似乎无法使用cmd以交互方式卸载我的测试包 .
如果我跑:
msiexec /x '{A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}'
msiexec /x A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8
我明白了:
"The installation package could not be opened. Verify that the package exists and that you can access it, or contact the application vendor to verify that this is a valid Windows Installer Package."
如果我跑: msiexec /x {A4BFF20C-A21E-4720-88E5-79D5A5AEB2E8}
我明白了:
"This action is only valid for products that are currently installed"
我查看了windows installer guide,WiX 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 回答
您指定的命令是正确的: msiexec /x
如果您收到“此操作仅对当前安装的产品有效”,则表示您使用了无法识别的产品或包裹代码,并且必须找到正确的产品或包裹代码 . 通常这可能是由于使用错误的 package code 而不是 product code 来卸载 - 包代码随着MSI文件的每次重建而改变,并且是您在查看msi文件的属性页时看到的唯一guid . 它应该适用于卸载,只要您使用正确的 . 没有错误的余地 . 如果要查找产品代码,则需要打开MSI . 产品代码可在Property表中找到 .
UPDATE, Jan 2018 :
随着所有注册表重定向的继续,我不确定以下基于注册表的方法是否可行 . 我没有正确检查,因为我现在依赖于使用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
Legacy, registry option :
您也可以通过阅读此基本密钥中的 registry 来 find the product code : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall . 按F3键搜索您的产品名称 . (如果它是64位计算机上的32位安装程序,则可能位于HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Windows \ CurrentVersion \ Uninstall下) .
Legacy, PowerShell option :(大致类似于上面新的,相关的答案)
最后,您可以使用PowerShell找到产品代码:
类似帖子:WiX - Doing a major upgrade on a multi instance install(如何在MSI中查找产品代码的屏幕截图) .
{}命令没有理由不起作用 . 半明显的问题是:
您确定该产品已实际安装! ARP /程序和功能中有一些东西 .
原始安装实际上在当前上下文中可见 . 它看起来好像是每用户安装,如果您现在以其他人身份登录,那么它将不会知道它 - 您需要在与原始安装相同的帐户下登录 .
如果\ windows \ installer目录已损坏,则缓存的文件将丢失,并且用于执行卸载 .
好处是,这个很容易且确定性地分析:要么,msi软件包确实没有安装在系统上,要么你做错了什么 . 当然正确的电话是:
(当然需要管理员权限 - 如果在命令行中指定了带有空白的路径或值,则只需要引号括号,只需要引号 . )
如果消息是:"This action is only valid for products that are currently installed",那么这是真的 . 没有安装带有此ProductCode的包或存在拼写错误 .
要验证故障的位置:
首先尝试右键单击(可能)已安装的.msi文件本身 . 您将看到(除了"Install"和"Repair")一个卸载条目 . 点击它 .
a)如果卸载有效,那么你的msi有另一个比你预期的ProductCode(可能你有错误的WiX源,或者你的构建有动态logig,其中ProductCode改变了) .
b)如果该卸载提供相同的"...only valid for products already installed",则未安装软件包(这是一个可以卸载它的前提条件) .
如果是1.a),如果您使用Orca,Insted或其他编辑器/工具打开msi文件,则可以查找包的正确ProductCode . 只是为他们谷歌 . 在表格中查找名称为“Property”的内容,并在第一列中搜索字符串“ProductCode” . 在第二列中有正确的值 .
没有别的可能性 .
只是对使用过的命令行的一个建议:我会为一个简单的进度条或“/ qn”参数添加至少“/ qb”(后者用于完全静默卸载,但只有在你确定时才有意义,它有效) .
msiexec.exe / x“{588A9A11-1E20-4B91-8817-2D36ACBBBF9F}”/ q
谢谢大家的帮助 - 结果证明这是一个WiX问题 .
如果产品ID GUID在问题中保持显式和硬编码,则生成的.msi在使用orca检查时没有ProductCode属性,而是产品ID属性 .
一旦我将GUID更改为'*'以自动生成,ProductCode就显示出来并且所有工作正常,其他答案确认了语法 .
你需要/ q在最后
试试这个命令msiexec / x / qr