Desinstalar un programa InstallShield Installscript MSI usando C # silenciosamente
Esto va a ser muy específico para InstallShield, así que dudo que alguien haya tratado con esto antes, pero escribí un archivo por lotes para desinstalar versiones anteriores de nuestro producto y no funciona. (Siempre desinstalamos versiones anteriores antes de una instalación / actualización ya que las Actualizaciones en InstallShield no parecen funcionar). La desinstalación de proyectos de Installscript MSI es muy diferente de las desinstalaciones típicas en que necesita "registrar" una desinstalación y almacenar los resultados en un archivo, es decir
setup.exe /x /r /f1"C:\temp\UNINST.ISS"
Esto almacena la imagen de desinstalación en c: \ temp \ UNINST.ISS y luego debe pasarla al desinstalador para que el producto desinstale:
setup.exe /s /f1"UNINST.ISS"
Así que hice esto para todas las versiones anteriores de nuestro producto y luego escribí un script por lotes (con el código del producto {7F2A0A82-BB08-4062-85F8-F21BFC3F3708} para hacer las desinstalaciones que se ven así:
echo Uninstalling 5.3.0
pause
if exist "C:\Program Files (x86)\InstallShield Installation Information\ {7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe" (
del /q "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe"
copy /y "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe" "C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe"
cls
echo Uninstalling 5.3.0
"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe" /s /f1".\Uninstall response files\5.3.0\UNINST-5.3.0.ISS"
:wait1
timeout /t 3 /NOBREAK > nul
tasklist | find /i "Setup-5.3.0.exe" >nul 2>nul
if not errorlevel 1 goto wait1
)
echo Uninstalling 5.3.1...
El problema es que no funciona. Si ejecuto la desinstalación desde una ventana CMD elevada, funciona bien:
"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe" /s /f1".\Uninstall response files\5.3.0\UNINST-5.3.0.ISS"
Pero cuando ejecuto el script por lotes, simplemente parece pasar por la desinstalación y no hacer nada. Entonces pensé que intentaría escribir un programa simple de C # para hacer esto, pero eso tampoco funciona:
Console.Clear();
Console.WriteLine("Uninstalling 5.3.0");
if (File.Exists(@"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe"))
{
File.Copy(@"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup.exe", @"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe", true);
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = @"C:\Program Files (x86)\InstallShield Installation Information\{7F2A0A82-BB08-4062-85F8-F21BFC3F3708}\setup-5.3.0.exe";
Directory.SetCurrentDirectory(@"..\..\..\");
startInfo.Arguments = "/s / f1\".\\Uninstall response files\\5.3.0\\UNINST-5.3.0.ISS\"";
startInfo.UseShellExecute = false;
startInfo.WindowStyle = ProcessWindowStyle.Normal;
using (Process process = new Process())
{
process.StartInfo = startInfo;
process.Start();
process.WaitForExit();
}
}
He intentado depurar esto y he confirmado que el directorio actual es correcto (usandoDirectory.GetCurrentDirectory()
), pero recibo este error:
process.StandardError' threw an exception of type 'System.InvalidOperationException' System.IO.StreamReader {System.InvalidOperationException}