Я пытаюсь автоматизировать удаление пакетов, созданных с помощью 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, документацию по WiX, документацию по msiexec и использовал orca для самостоятельного просмотра .msi, но на самом деле я не нашел ничего, что давало бы четкое представление о том, как обрабатывается удаление. Требуется ли MSI файл, и если нет, то почему установщик Windows считает, что это происходит, когда ему присваивается GUID?
Код WiX для установщика .msi:
<?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>