it-swarm.com.de

Wie erstelle ich in einem Visual Studio-Setup-Projekt ein Deinstallationsskript?

Ich habe ein Visual Studio-Setup-Projekt. Bei der Installation wird eine Deinstallationsstapeldatei im Anwendungsordner erstellt. Wenn der Benutzer das Produkt deinstallieren möchte, kann er zu "Software" wechseln oder einfach auf uninstall.cmd doppelklicken. Die Inhalte sind:

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

Die GUID gibt den ProductCode aus dem Setup-Projekt in Visual Studio an.

ProductCode

Damit Upgrades jedoch ordnungsgemäß funktionieren, muss ich die Versionsnummer jedes Mal erhöhen, wenn ich eine neue MSI-Datei erstelle. Und wenn ich die Versionsnummer erhöhe, muss ich auch eine neue Guid für den ProductCode generieren. Das bedeutet, dass sich die statische Datei uninstall.cmd ändern muss.

Wie kann ich dynamisch eine Batch-Datei generieren, die den ProductCode für die, zum Zeitpunkt der Erstellung enthält?

27
Cheeso

Dies ist das Skript, das ich geschrieben habe, um eine uninstall.cmd zu erstellen. Es wird während der Installation als benutzerdefinierte Aktion ausgeführt. 

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();

Das Ergebnis ist eine cmd-Datei, die immer den aktuellen ProductCode enthält. 

Der Nachteil davon ist, dass? das Skript, das die uninstall.cmd erstellt, im Installationsverzeichnis verbleibt. Kein großes Problem, aber ich mag den Müll im Installationsverzeichnis nicht. Ich habe noch nicht versucht, die "createInstaller.js" selbst zu löschen. Das könnte funktionieren. 

EDIT: yes, das selbstlöschen von createInstaller.js funktioniert einwandfrei. 

Ich werde meine eigene Antwort akzeptieren! 

3
Cheeso

Ich habe diese Lösung gefunden hier

"Bei Verwendung von Visual Studio 2005/2008 müssen Sie keinen Code schreiben, um eine Deinstallationsoption für ein Setup-Projekt hinzuzufügen (Ja, einige Leute können dazu Code schreiben).

1) Klicken Sie im Setup-Projekt -> Dateisystemfenster -> Rechtsklick auf "Dateisystem auf Zielmaschine" -> fügen Sie einen speziellen Ordner hinzu, und wählen Sie Systemordner.

2) In diesen Systemordner Eine Datei hinzufügen. Suchen Sie im lokalen System32-Ordner nach msiexec.exe, und fügen Sie es hinzu. Überschreiben Sie die Standardeigenschaften dieser Datei wie folgt:

Bedingung: = Nicht installiert (Stellen Sie sicher, dass Sie 'Nicht installiert' genauso setzen, denselben Fall und alles)), Permanent: = Richtig, System: = Richtig, Transitiv : = Wahr, Lebenswichtig: = falsch.

3) Erstellen Sie eine neue Verknüpfung unter dem Menü "Benutzerprogramm", setzen Sie das Ziel auf den Systemordner, den Sie in Schritt 1 erstellt haben, und verweisen Sie auf "msiexec.exe". Benennen Sie die Verknüpfung in "Deinstallieren Sie Ihre Anwendung" um. Legen Sie die Arguments-Eigenschaft auf/x {Leerzeichen} [ProductCode] fest.

4) Erstellen Sie das Projekt, ignorieren Sie die Warnung, dass msiexec ausgeschlossen werden soll, schließen Sie es NICHT aus oder das Setup-Projekt wird nicht erstellt.

Die Bedingung 'Not Installed' und Permananet: = True stellen sicher, dass die Datei msiexec.exe nur als Teil der Installation im Systemordner abgelegt wird. WENN sie nicht vorhanden ist und bei einer Deinstallation nicht entfernt wird - s ziemlich sicher, diese Warnung zu ignorieren und einfach dafür zu gehen.

(Basierend auf der Beschreibung von SlapHead) "

65
Ben

Ich habe gerade dies Arbeit gemacht:

Fügen Sie Ihrem Projekt eine uninstall.bat-Datei hinzu. Der Inhalt der Datei ist:

msiexec.exe /x %1

Erstellen Sie eine Verknüpfung zu dieser Stapeldatei (z. B. im Benutzermenü des Benutzers) und geben Sie in den Eigenschaften der Verknüpfung neben Argumente Folgendes an: [ProductCode].

11
MPelletier

eine leichte Abweichung vom Ansatz der Batchdatei. Wenn Sie kein Befehlsfenster anzeigen möchten, verwenden Sie eine Wscript-Datei. Geben Sie [ProductCode] wie zuvor in Argumente an

<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
locksmith

Ich habe eine Kombination aus der akzeptierten Antwort und der Antwort von Locksmith gemacht, um keine Aufleuchten des Befehls Prompt oder des Befehls Prompt selbst zu sehen. Ein Vorteil davon ist, dass Sie NICHT eine Verknüpfung erstellen und die Argumente dafür setzen müssen, damit sie funktioniert.

Meine Datei createUninstaller.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();

Diese Datei wird als benutzerdefinierte Aktion im Commit-Aktionsverzeichnis hinzugefügt. Um tatsächlich zu diesen benutzerdefinierten Aktionen zu gelangen: Klicken Sie mit der rechten Maustaste auf Ihr Setup-Projekt> Ansicht> Benutzerdefinierte Aktionen> Klicken Sie mit der rechten Maustaste auf Commit 'directory'> und fügen Sie benutzerdefinierte Aktion hinzu. Nachdem Sie nach der erstellten Datei createUninstaller.js gesucht haben, fügen Sie sie hinzu.

Um jetzt die createUninstaller.js dazu zu bringen, die Variablen targetDir und productCode zu lesen, müssen Sie
Klicken Sie mit der rechten Maustaste auf die Datei createUninstaller.js im benutzerdefinierten Aktionsprojekt 'Festschreibungsverzeichnis' und wechseln Sie zum Eigenschaftenfenster. In den Eigenschaften wird die Eigenschaft 'CustomActionData' angezeigt. Dort kopieren Sie einfach einfügen [TARGETDIR] | [ProductCode]
Und VOILA! Jetzt sollte die Datei Uninstall.js hinzugefügt werden, die funktioniert, sobald Sie darauf doppelklicken.

1
Merv

Mir ist klar, dass diese Frage bereits beantwortet wurde, aber ich habe eine Batch-Datei mit folgendem Inhalt erstellt:

start msiexec.exe /x %1

Die Verwendung von "Start" verhindert, dass der Befehl "Eingabeaufforderung" während des Deinstallationsvorgangs geöffnet bleibt.% 1 wird durch das erste Argument ersetzt, das Sie bei der Ausführung an die Batchdatei übergeben.

Ich habe die Batchdatei zum Anwendungsordner hinzugefügt und eine Menüverknüpfung erstellt, die auf die Batchdatei verweist. Wenn Sie mit der rechten Maustaste auf die Verknüpfung klicken und Eigenschaftenfenster auswählen. Fügen Sie dort der Arguments-Eigenschaft den folgenden Text hinzu:

[ProductCode]

Nachdem Sie das Installationsprogramm erstellt und ausgeführt haben, haben Sie eine Startmenü-Verknüpfung, die die Batchdatei aufruft und den Produktcode so übergibt, wie er zum Zeitpunkt der Erstellung dieser Version der Anwendung war. Der Benutzer wird dann in einer Eingabeaufforderung gefragt, ob das Produkt deinstalliert werden soll.

Der einzige Nachteil dieser Lösung besteht darin, dass das Deinstallationsprogramm eine Fehlermeldung ausgibt, dass das Installationspaket nicht vorhanden ist, wenn der Benutzer den Anwendungsordner ansteuert und auf die Batchdatei doppelklickt.

1
Jela

Um die Anwendung zu entfernen, würde ich den [ProductCode] als Parameter verwenden und die msiexec aus der Anwendung heraus aufrufen. Eine ausführliche Anleitung zum Erstellen des Deinstallationsprogramms finden Sie in diesem Blog: http://endofstream.com/creating- Uninstaller-in-a-Visual-Studio-Projekt/

1
Peter

jedes Mal, wenn Sie ein Setup erstellen, ändern Sie immer den Produktcode. Erstellen Sie eine Deinstallationsverknüpfung, und Sie werden Befehlszeilenargumenten finden, um den Schnitt zu sortieren. Dort schreiben Sie immer "/ u product code" Produktcode, den Sie hier immer schreiben müssen.

setzen Sie diesen Code in die Hauptmethode der Datei program.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
Thomas