W projekcie instalacyjnym Visual Studio, jak wygenerować skrypt odinstalowujący?

Mam projekt instalacji Visual Studio. Po instalacji tworzy plik wsadowy deinstalacji w folderze aplikacji. Jeśli użytkownik chce odinstalować Produkt, może przejść do "Dodaj / usuń programy"lub po prostu kliknąć dwukrotnie Odinstaluj.cmd. Zawartość:

%windir%\system32\msiexec /x {CC3EB7BF-DD82-48B9-8EC5-1B0B62B6D285}

GUID to kod produktu z projektu instalacyjnego w Visual Studio.

Kod produktu

Ale, aby uaktualnienia działały poprawnie, muszę zwiększyć numer wersji, za każdym razem wyprodukuj nowy MSI. I, jeśli zwiększyć Numer wersji, to muszę również wygenerować nowy Guid dla ProductCode. Co oznacza odinstalowanie statyczne.plik cmd musi się zmienić.

Jak mogę dynamicznie wygenerować plik wsadowy zawierający kod produktu w czasie kompilacji?

Author: Cheeso, 2009-08-31

8 answers

Znalazłem to rozwiązanie tutaj

"używając Visual Studio 2005/2008, nie musisz pisać żadnego kodu, aby dodać opcję dezinstalacji dla projektu instalacyjnego (tak, Wiem, że niektórzy ludzie mogą napisać kod, aby to zrobić)

1) w projekcie konfiguracyjnym –> system plików windows – > kliknij prawym przyciskiem myszy "system plików na docelowej maszynie" - > dodaj specjalny Folder, wybierz folder systemowy;

2) do tego folderu systemowego Dodaj plik. Przeglądaj dla msiexec.exe z lokalnego folderu System32 i dodaj go. Nadpisz wartość domyślną właściwości tego pliku w następujący sposób:

Condition: = Not Installed (upewnij się, że umieściłeś 'Not Installed' dokładnie tak, ta sama sprawa i wszystko), Permanent: = True,, System: = True,, Transitional: = True,, Vital: = False.

3) Utwórz nowy skrót w "menu programu użytkownicy", Ustaw cel do folderu systemowego, który został utworzony w kroku 1. i celuj w msiexec.exe. Zmień nazwę skrótu na "Odinstaluj aplikację". Ustaw właściwość Arguments na /x {space} [ProductCode].

4) Zbuduj projekt, zignoruj ostrzeżenie o tym, że msiexec powinien być wykluczony, nie wykluczaj go lub projekt instalacyjny nie zbuduje.

Warunek "nie zainstalowany"i Permananet: = True zapewniają, że msiexec.exe jest umieszczany tylko w folderze systemowym jako część instalacji, jeśli nie istnieje, i nie jest usuwany podczas deinstalacji-dlatego jest całkiem bezpieczny, aby zignorować to Ostrzeżenie i po prostu przejść do niego.

(Na podstawie opisu od SlapHead) "

 64
Author: Ben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-22 17:00:30

Właśnie zrobiłem to dzieło:

Dodaj odinstalowanie.plik bat do twojego projektu. Zawartość pliku to:

msiexec.exe /x %1

Utwórz skrót do tego pliku wsadowego (powiedzmy w menu programu użytkownika), określ we właściwościach skrótu, obok argumentów: [ProductCode].

 11
Author: MPelletier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:35

To jest skrypt, który napisałem, który tworzy deinstalację.cmd. Działa jako niestandardowe działanie podczas instalacji.

var fso, ts;
var ForWriting= 2;
fso = new ActiveXObject("Scripting.FileSystemObject");

var parameters = Session.Property("CustomActionData").split("|"); 
var targetDir = parameters[0];
var productCode = parameters[1];

ts = fso.OpenTextFile(targetDir + "uninstall.cmd", ForWriting, true);

ts.WriteLine("@echo off");
ts.WriteLine("goto START");
ts.WriteLine("=======================================================");
ts.WriteBlankLines(1);
ts.WriteLine(" Uninstall.cmd");
ts.WriteBlankLines(1);
ts.WriteLine("=======================================================");
ts.WriteBlankLines(1);
ts.WriteLine(":START");
ts.WriteLine("@REM The uuid is the 'ProductCode' in the Visual Studio setup project");
ts.WriteLine("%windir%\\system32\\msiexec /x " + productCode);
ts.WriteBlankLines(1);
ts.Close();

Wynikiem jest plik cmd, który zawsze zawiera bieżący kod produktu.

Minusem tego jest to ?skrypt, który tworzy deinstalację.cmd pozostaje w katalogu instalacyjnym. Nie jest to wielki problem, ale nie lubię śmieci w katalogu install. Jeszcze nie próbowałem zrobić " createInstaller.js " samo-kasowanie. To może zadziałać.

EDIT: tak, tworzenie createInstaller.samo usuwanie js działa dobrze.

Przyjmę własną odpowiedź!
 3
Author: Cheeso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-10 17:50:52

Niewielka zmiana podejścia do plików wsadowych. jeśli nie chcesz wyświetlać okna poleceń, użyj pliku wscript. supply [ProductCode] jak poprzednio w argumentach

<job>
<?job debug="true" error="true" ?>
<script language="JScript">
    var arg = [];
    for (var i=0; i<WSH.Arguments.length; i++) {
        arg.push( WSH.Arguments.Item(i) );
    }

    if (arg.length>0) {
        var productcode = arg[0];
        var v = new ActiveXObject("Shell.Application");
        v.ShellExecute("msiexec.exe", "/x "+productcode, "", "open", 10);
    }

    WSH.Quit(0);
</script>
</job>
 2
Author: locksmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-27 04:12:59

Do usunięcia aplikacji użyłbym [ProductCode] jako parametru, wywołując msiexec z samej aplikacji - aby uzyskać szczegółowy przewodnik dotyczący tworzenia deinstalatora, zajrzyj na ten blog: http://endofstream.com/creating-uninstaller-in-a-visual-studio-project/

 1
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 19:04:52

Zdaję sobie sprawę, że na to pytanie już odpowiedziałam, ale to, co zrobiłem, to utworzenie pliku wsadowego o następującej treści:

start msiexec.exe /x %1

Użycie "start" uniemożliwia otwarcie wiersza polecenia podczas odinstalowywania, a %1 jest zastępowany pierwszym argumentem przekazanym do pliku wsadowego podczas jego wykonywania.

Dodałem plik wsadowy do folderu aplikacji i utworzyłem skrót menu, który wskazuje na plik wsadowy. Po kliknięciu prawym przyciskiem myszy skrótu i wybraniu Okno Właściwości. W tym miejscu dodaj następujący tekst do Właściwości Arguments:

[ProductCode]

Po zbudowaniu i uruchomieniu Instalatora, pojawi się skrót w menu start, który wywoła plik wsadowy i przekazuje Kod produktu tak, jak to było w momencie budowy tej wersji aplikacji. Użytkownik zobaczy monit z pytaniem, czy produkt powinien zostać odinstalowany.

Jedynym minusem tego rozwiązania jest to, że jeśli użytkownik przejrzy folder aplikacji i dwukrotnie kliknie plik wsadowy, deinstalator wyświetli błąd, że pakiet instalacyjny nie istnieje.

 1
Author: Jela,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-07 13:34:31

Zrobiłem kombinację zaakceptowanej odpowiedzi i odpowiedzi ślusarza, aby nie zobaczyć żadnych błysków wiersza polecenia lub samego wiersza polecenia. Jednym z pro jest to, że nie musisz tworzyć skrótu i ustawiać argumentów, aby działał.

Mój createUninstaller.plik js:

var fso, ts;
var ForWriting= 2;
fso = new ActiveXObject("Scripting.FileSystemObject");

var parameters = Session.Property("CustomActionData").split("|"); 
var targetDir = parameters[0];
var productCode = parameters[1];

ts = fso.OpenTextFile(targetDir + "Uninstall.js", ForWriting, true);

ts.WriteLine("var v = new ActiveXObject(\"Shell.Application\");");
ts.WriteLine("v.ShellExecute(\"msiexec.exe\", \"/x "+productCode+"\", \"\", \"open\",10);");
ts.Close();

Ten plik jest dodawany jako niestandardowa akcja w operacji commit 'directory'. Aby rzeczywiście dostać się do tych niestandardowych działań: kliknij prawym przyciskiem myszy swój projekt instalacyjny>widok>niestandardowy Akcje>kliknij prawym przyciskiem myszy Zatwierdź 'katalog' >dodaj niestandardową akcję. Po trzeba szukać createUninstaller.plik JS, który utworzyłeś i dodaj go.

Teraz zrobić createUninstaller.js odczytaj zmienne targetDir i productCode, które musisz
Kliknij prawym przyciskiem myszy createUninstaller.plik js w niestandardowej akcji projektu setup katalog 'commit' i przejdź do okna właściwości. W properties zobaczysz właściwość 'CustomActionData'. Tam po prostu kopiuj wklej [TARGETDIR] / [ProductCode]
I VOILA! Powinien teraz dodać deinstalację.plik js, który będzie działał, gdy tylko dwukrotnie go klikniesz.

 1
Author: Merv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 13:01:04

Za każdym razem, gdy generujesz konfigurację, zawsze zmieniaj Kod produktu. Utwórz skrót dezinstalatora, a tam znajdziesz technikę przekazywania argumentów wiersza poleceń do sortowania cięcia. tam u będzie pisać zawsze "/ u Kod produktu " Kod produktu u trzeba napisać tutaj zawsze.

Umieść ten kod w głównej metodzie programu.plik cs

[STAThread]
        static void Main()
        {
            bool flag = true;
            string[] arguements = Environment.GetCommandLineArgs();
            foreach (string str in arguements)
            {
                if ((str.Split('='))[0].ToLower() == "/u")
                {
                    if (MessageBox.Show("Do you want to uninstall job board", "Are you Sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        flag = false;
                        RemoveRegSettings();
                        RemoveIniFile();
                        string guid = str.Split('=')[1];
                        string path = Environment.GetFolderPath(Environment.SpecialFolder.System);
                        ProcessStartInfo si = new ProcessStartInfo(path + @"\msiexec.exe", "/i" + guid);
                        Process.Start(si);
                        Application.Exit();
                        return;
                    }
                }
            }
            //

            //************************************************
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
 0
Author: Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 12:50:57