Gostaria de modificar um instalador MSI (criado pelo WiX ) para excluir um diretório inteiro na desinstalação.
Entendo as opções RemoveFile
e RemoveFolder
no WiX, mas elas não são robustas o suficiente para excluir recursivamente uma pasta inteira com conteúdo criado após a instalação.
Percebi a pergunta similar Stack Overflow Removendo arquivos ao desinstalar o WiX , mas fiquei pensando se isso poderia ser feito mais simplesmente usando uma chamada para um script em lote para excluir a pasta.
Esta é a primeira vez que uso o WiX, e ainda estou pegando o jeito das ações personalizadas . Qual seria um exemplo básico de uma ação personalizada que executará um script em lote na desinstalação?
fonte
Existem vários problemas com a resposta de yaluna , também os nomes de propriedades diferenciam maiúsculas de minúsculas,
Installed
é a ortografia correta (INSTALLED
não funcionará). A tabela acima deveria ter sido esta:Supondo também que um reparo completo e desinstalação dos valores reais das propriedades possam ser:
A documentação da WiX Expression Syntax diz:
As propriedades estão documentadas no Guia do Windows Installer (por exemplo, Instalado )
EDIT: Pequena correção para a primeira tabela; evidentemente "Desinstalar" também pode acontecer com apenas
REMOVE
serTrue
.fonte
Você pode fazer isso com uma ação personalizada. Você pode adicionar uma referência à sua ação personalizada em
<InstallExecuteSequence>
:Então você também terá que definir sua ação em
<Product>
:Onde FileCleanerEXE é um binário (no meu caso, um pequeno programa c ++ que executa a ação personalizada) que também é definido em
<Product>
:O verdadeiro truque para isso é o
Installed AND NOT UPGRADINGPRODUCTCODE
condição da Ação personalizada, sem que sua ação seja executada em todas as atualizações (uma vez que uma atualização é realmente uma desinstalação e reinstalação). O que, se você estiver excluindo arquivos, provavelmente não será o desejado durante a atualização.Em uma nota lateral: eu recomendo enfrentar o problema de usar algo como o programa C ++ para executar a ação, em vez de um script em lote devido à energia e controle que ele fornece - e você pode impedir que a janela "cmd prompt" pisque enquanto seu instalador é executado.
fonte
CustomAction
será executado "Depois = 'InstallFinalize'". Neste ponto, todos os arquivos são removidos da pasta Instalação. Também o fileCleaner.exe. Portanto, você não pode executá-lo por meio de uma CustomAction. Esta resposta está simplesmente errada. Eu estou querendo saber sobre os 42 upvotes!O maior problema com um script em lote é lidar com a reversão quando o usuário clica em cancelar (ou algo dá errado durante a instalação). A maneira correta de lidar com esse cenário é criar uma CustomAction que adicione linhas temporárias à tabela RemoveFiles. Dessa forma, o Windows Installer lida com os casos de reversão para você. É incrivelmente mais simples quando você vê a solução.
De qualquer forma, para executar uma ação apenas durante a desinstalação, adicione um elemento Condition com:
o ~ = diz que a comparação não diferencia maiúsculas de minúsculas (embora eu ache que ALL é sempre superior). Consulte a documentação do MSI SDK sobre sintaxe de condições para obter mais informações.
PS: Nunca houve um caso em que me sentei e pensei: "Oh, o arquivo em lotes seria uma boa solução em um pacote de instalação". Na verdade, encontrar um pacote de instalação que contenha um arquivo em lotes só me incentivaria a devolver o produto para um reembolso.
fonte
Aqui está um conjunto de propriedades que fiz que parecem mais intuitivas de usar do que as coisas incorporadas. As condições são baseadas na tabela verdade fornecida acima por ahmd0.
Aqui está um exemplo de uso:
Problemas:
fonte
Usei a Ação personalizada codificada separadamente na DLL C ++ e usei a DLL para chamar a função apropriada em Desinstalando usando esta sintaxe:
Usando o bloco de código acima, consegui executar qualquer função definida na DLL do C ++ na desinstalação. Para sua informação, minha função de desinstalação tinha um código referente à limpeza de dados atuais do usuário e entradas do registro.
fonte