Chciałbym zmodyfikować instalator MSI (utworzony za pomocą WiX ), aby usunąć cały katalog podczas odinstalowywania.
Rozumiem opcje RemoveFile
i RemoveFolder
w WiX, ale nie są one wystarczająco solidne, aby rekurencyjnie usunąć cały folder zawierający zawartość utworzoną po instalacji.
Zauważyłem podobne pytanie dotyczące przepełnienia stosu Usuwanie plików podczas odinstalowywania WiX , ale zastanawiałem się, czy można to zrobić prościej, używając wywołania skryptu wsadowego, aby usunąć folder.
Po raz pierwszy używam WiX i wciąż rozumiem niestandardowe akcje . Jaki byłby podstawowy przykład niestandardowej akcji, która uruchomi skrypt wsadowy podczas odinstalowywania?
źródło
Istnieje wiele problemów z odpowiedzią yaluna , również nazwy nieruchomości uwzględniają wielkość liter,
Installed
jest poprawna pisownia (INSTALLED
nie będzie działać). Powyższa tabela powinna wyglądać następująco:Zakładając również pełną naprawę i odinstalowanie, rzeczywiste wartości właściwości mogą być następujące:
Dokumentacja składni wyrażeń WiX mówi:
Właściwości są udokumentowane w Przewodniku Instalatora Windows (np. Zainstalowane )
EDYCJA: Mała poprawka do pierwszej tabeli; ewidentnie „Odinstaluj” może się również zdarzyć po prostu
REMOVE
będącTrue
.źródło
Możesz to zrobić za pomocą akcji niestandardowej. Możesz dodać odwołanie do akcji niestandardowej w
<InstallExecuteSequence>
:Następnie musisz również zdefiniować swoją akcję w
<Product>
:Gdzie FileCleanerEXE to plik binarny (w moim przypadku mały program C ++, który wykonuje niestandardową akcję), który jest również zdefiniowany w
<Product>
:Prawdziwą sztuczką jest
Installed AND NOT UPGRADINGPRODUCTCODE
sytuacja w Akcji niestandardowej, bez tego, że akcja będzie uruchamiana przy każdej aktualizacji (ponieważ aktualizacja to tak naprawdę odinstalowanie, a następnie ponowna instalacja). Co, jeśli usuwasz pliki, prawdopodobnie nie jest pożądane podczas aktualizacji.Na marginesie: zalecam rozwiązanie problemu z użyciem czegoś takiego jak program C ++ do wykonania tej akcji, zamiast skryptu wsadowego ze względu na jego moc i kontrolę - i możesz zapobiec miganiu okna „zachęty cmd” podczas Twój instalator działa.
źródło
CustomAction
zostanie wykonany „After = 'InstallFinalize'”. W tym momencie wszystkie pliki są usuwane z folderu instalacyjnego. Również plik fileCleaner.exe. Dlatego nie możesz go wykonać za pomocą CustomAction. Ta odpowiedź jest po prostu błędna. Zastanawiam się nad 42 głosami za!Największym problemem związanym ze skryptem wsadowym jest obsługa wycofywania, gdy użytkownik kliknie przycisk Anuluj (lub coś pójdzie nie tak podczas instalacji). Prawidłowym sposobem obsługi tego scenariusza jest utworzenie CustomAction, która dodaje tymczasowe wiersze do tabeli RemoveFiles. W ten sposób Instalator Windows obsługuje przypadki wycofywania zmian. Jest to szalenie prostsze, gdy widzisz rozwiązanie.
W każdym razie, aby akcja była wykonywana tylko podczas deinstalacji, dodaj element warunku z:
~ = mówi porównaj bez rozróżniania wielkości liter (chociaż myślę, że WSZYSTKO jest zawsze wielkie). Więcej informacji można znaleźć w dokumentacji zestawu MSI SDK na temat składni warunków .
PS: Nigdy nie było przypadku, gdybym usiadł i pomyślał: „Och, plik wsadowy byłby dobrym rozwiązaniem w pakiecie instalacyjnym”. Właściwie znalezienie pakietu instalacyjnego zawierającego plik wsadowy tylko zachęciłoby mnie do zwrotu produktu w celu uzyskania zwrotu pieniędzy.
źródło
Oto zestaw właściwości, które stworzyłem, które są bardziej intuicyjne w użyciu niż wbudowane elementy. Warunki są oparte na tabeli prawdy dostarczonej powyżej przez ahmd0.
Oto kilka przykładowych zastosowań:
Zagadnienia:
źródło
Użyłem akcji niestandardowej oddzielnie zakodowanej w C ++ DLL i użyłem biblioteki DLL do wywołania odpowiedniej funkcji podczas odinstalowywania, używając następującej składni:
Korzystając z powyższego bloku kodu, mogłem uruchomić dowolną funkcję zdefiniowaną w C ++ DLL podczas odinstalowywania. FYI, moja funkcja dezinstalacji zawiera kod dotyczący czyszczenia bieżących danych użytkownika i wpisów rejestru.
źródło