Tengo un proyecto de instalación de Visual Studio.
Tras la instalación, se crea una desinstalación por lotes de archivos en la carpeta de la aplicación. SI el usuario desea desinstalar el producto, que puede ir a «Agregar/Quitar Programas», o puede simplemente haga doble clic en desinstalar.cmd. Los contenidos son:

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

El GUID no es el Código de producto del Proyecto de Instalación de Visual Studio.

En una instalación de Visual Studio proyecto, ¿Cómo puedo generar un script de desinstalación?

Pero, para que las actualizaciones para que funcione correctamente, tengo que incrementar el número de Versión, cada vez que me producen un nuevo MSI. Y, si me incrementar el número de Versión, entonces yo también tengo que generar un nuevo Guid para el Código de producto. Lo que significa que la estática desinstalar.archivo cmd que necesita cambiar.

¿Cómo puedo generar dinámicamente un archivo por lotes que contiene el Código de producto para el, en el tiempo de generación?

InformationsquelleAutor Cheeso | 2009-08-31

8 Comentarios

  1. 65

    He encontrado esta solución aquí

    «El uso de Visual Studio 2005/2008, no es necesario escribir ningún código para agregar una opción de desinstalación para un proyecto de Instalación (Sí, sé que algunas personas se puede escribir código para hacerlo)

    1) En el Proyecto de Instalación –> Archivo de Sistema de windows> Haga Clic en «Sistema de Archivos en el equipo de Destino» –> agregar una Carpeta, seleccione la Carpeta de Sistema;

    2) En este sistema la carpeta de Agregar un archivo. Buscar msiexec.exe desde el local de la carpeta System32 y agregarlo. Anular la configuración predeterminada de las propiedades de este archivo como sigue:

    Condición:=No Instalado (asegúrese de poner «No Instalado» exactamente igual que, en el mismo caso y todo),
    Permanente:=True,
    Sistema:=True,
    Transitiva:=True,
    Vital:=False.

    3) Crear un nuevo acceso directo en el marco del ‘Programa Usuarios de Menú’, ha Establecido un Objetivo para el Sistema de la Carpeta que creó en el paso 1. y el punto es en el msiexec.exe. Cambiar el nombre del acceso directo a «Desinstalar la Aplicación’. Establezca la propiedad Argumentos a /x{espacio}[Código].

    4) Construir el proyecto, ignorar la advertencia sobre el hecho de que msiexec debe ser excluido, NO la excluye o el proyecto de instalación no construir.

    El «No Instalado» condición y Permananet:=True asegurarse de que el msiexec.exe es sólo que se coloca en la carpeta del sistema como parte de la instalación SI no apreparadas existe, y no se quita en un desinstalar – por lo tanto;s bastante seguro para ignorar la advertencia, e ir a por ella.

    (Basado en la descripción de SlapHead)»

    • Ahora que es muy útil y mucho más directo que el enfoque que tomó.
    • Impresionante, funciona muy bien para mí en WinXP/Vista & Win7. Vale la pena señalar que de acuerdo con el artículo vinculado, si utiliza una versión de msiexec.exe MÁS alto que el objetivo de la plataforma hay problemas. Este no es un problema para mí, como estoy todavía intencionalmente el uso de XP para la construcción, pero, obviamente, si usted desea un instalador construido en Vista a ejecutarse en XP que va a ser un problema.
    • Gran Post!!! Exactamente lo que estaba buscando.
    • En cuanto al problema que surge cuando la construcción del Instalador en windows Vista/7, y el instalador intenta sobrescribir msiexec en los más antiguos, máquinas con XP, esto puede ser corregido mediante la creación de un vacío .archivo txt, y el cambio de nombre a «msiexec.exe.» Incluir el archivo en su instalador, en lugar de la real System32 versión. Desde el vacío, falso archivo no tiene información de la versión, no va a intentar sobrescribir el XP msiexec.
    • ¿qué acerca de VS2010
    • He intentado con éxito esta solución en VS2010
    • Esta es una buena idea. Pero tengo un problema. Cuando hago clic en desinstalar acceso directo me arroja el error : «Este paquete de instalación no se pudo abrir. Compruebe que el paquete existe y que puede obtener acceso a él, o en contacto con el proveedor de la aplicación para comprobar que es un paquete de Windows Installer.» . Por qué me arroja este error. Sé que ha sido un par de años, pero ahora la estoy usando….
    • Tengo el mismo error demasiado. Establezca la propiedad Argumentos a /x{espacio}[Código] no es un trabajo para mí ,pero puedo cambiar la propiedad Argumentos a /x [Código],funciona.Supongo que visual studio no puede reconocer lo que está {espacio} means.by el camino ,he intentado en VS2005.
    • Esta probado con VS2015 hoy en día, funciona muy bien, gracias!

  2. 11

    Acabo de hacer este trabajo:

    Agregar una desinstalación.archivo bat para su proyecto. El contenido del archivo es:

    msiexec.exe /x %1
    

    Hacer un acceso directo a ese archivo por lotes (dicen que en el Programa del Usuario Menú), especifique en las propiedades del acceso directo, junto a los Argumentos: [ProductCode].

    • Usted puede deshacerse de la ventana negra por el uso de start msiexec.exe /x %1; pero la ventana negra todavía parpadea.
    • Probablemente start /B msiexec.exe /x %1.
    • no, ni /b
    • Trate de /min, debería al menos minimizarla.
    • no, el windows que parpadea no es la de el comando de arranque, es el uno de los .bat, por lo que un conmutador adicional no es la solución; la solución está en el vdproj proyecto de la instalación: el ShowCmd de propiedades del acceso directo llamando desde el valor vsdscNormal valor a la vsdscMinimized valor. Solucionado.
  3. 4

    Este es el script que yo escribí y que crea un desinstalación.cmd. Se ejecuta como una acción personalizada durante la instalación.

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

    El resultado es un archivo cmd que siempre tiene el actual Código de producto en ella.

    La desventaja de esto es que ?el script que crea la desinstalación.cmd permanece en el directorio de instalación. No es un gran problema, pero no me gusta la basura en el directorio de instalación. Todavía no he probado a hacer la «createInstaller.js» la auto-eliminación. Que podría funcionar.

    EDITAR: sí, haciendo que el createInstaller.js la auto-eliminación funciona bien.

    Voy a aceptar mi propia respuesta!

    • Multa solución pero, maldita sea chapucero, me pregunto acerca de Microsoft, Instalar los tomadores he intentado antes (tal inno) estaba haciendo desinstalar automáticamente el archivo.
    • Sé que ha sido un par de años, pero me gustaría saber cómo es exactamente lo que pasó sobre el uso de este, Cheeso. Estás anulando la OnAfterInstall? Si es así, ¿cómo puede insertar Script allí?
  4. 2

    una ligera variación en el archivo de proceso por lotes enfoque. si usted no desea mostrar una ventana de comandos, utilice un wscript archivo. suministro [Código] como antes en Argumentos

    <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>
    
  5. 1

    Me doy cuenta de que esta pregunta ya ha sido contestada, pero yo lo que hice fue crear un archivo por lotes con el siguiente contenido:

    start msiexec.exe /x %1
    

    El uso de «inicio» que impide que el símbolo de permanecer abierta durante el proceso de desinstalación y el %1 se sustituye por el primer argumento que se le pasa el archivo por lotes cuando la ejecución de la misma.

    He añadido el archivo de proceso por lotes a la carpeta de aplicaciones y crea un acceso directo en el menú que apunta al archivo de proceso por lotes. Si hace clic derecho en el acceso directo y seleccione Propiedades de la Ventana. Allí, agregue el siguiente texto a los Argumentos de la propiedad:

    [ProductCode]
    

    Después de compilar y ejecutar el instalador, usted tendrá un acceso directo al menú inicio que se llama el archivo de proceso por lotes y pasa el código de producto como lo fue cuando la versión de la aplicación fue construida. El usuario verá un mensaje preguntando si el producto debe ser desinstalado.

    El único inconveniente de esta solución es que si el usuario navega a la carpeta de la aplicación y haga doble clic en el archivo de proceso por lotes, el programa dará un error de que el paquete de instalación no existe.

  6. 1

    Hice una combinación de los aceptados respuesta y Cerrajería respuesta no ver destellos de símbolo del sistema o el símbolo del sistema en sí. Uno pro de hacerlo como este es que usted NO TIENE que crear un acceso directo y el conjunto de los argumentos para ello en orden para que funcione.

    Mi createUninstaller.js archivo:

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

    Este archivo se agrega como una acción personalizada al cometer la acción ‘en el directorio’. En el fin de realmente llegar a esta costumbre acciones:
    haga clic derecho con el proyecto de instalación>ver>acciones personalizadas>haga clic en commit ‘directorio’>agregar acción personalizada. Después de la búsqueda de la createUninstaller.js archivo creado y agregarlo.

    Ahora para realizar la createUninstaller.js leer las variables targetDir y productCode usted tiene que


    Haga clic derecho en el createUninstaller.js en el archivo de proyecto de instalación personalizada de acción
    ‘commit’ directorio y vaya a la ventana de propiedades.
    En propiedades verá la ‘CustomActionData’ de la propiedad. Allí usted acaba de copiar pegar [TARGETDIR]|[Código]

    Y VOILA! Ahora debe agregar el Uninstall.js fichero que se va a trabajar tan pronto como usted haga doble clic en él.

  7. 0

    cada vez cuando u generar el programa de instalación, a continuación, cambie siempre el código de producto. crear un programa de desinstalación de acceso directo y no u encontrará argumento de línea de comandos de la técnica que pasa a tipo de corte. hay u se escribe siempre «/u código de producto» código del producto u necesidad de escribir aquí siempre.

    poner este código en el método main del programa.cs archivo

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

Dejar respuesta

Please enter your comment!
Please enter your name here