Удаление программы InstallShield Installscript MSI с использованием C # в автоматическом режиме

Это будет очень специфично для InstallShield, поэтому я сомневаюсь, что кто-то имел дело с этим раньше, но я написал командный файл для удаления предыдущих версий нашего продукта, и он не работает. (Мы всегда удаляем предыдущие версии перед установкой / обновлением, поскольку обновления в InstallShield не работают). Удаление проектов Installscript MSI сильно отличается от типичных удалений тем, что вам нужно «записать» удаление и сохранить результаты в файле, например:

setup.exe /x /r /f1"C:\temp\UNINST.ISS"

Это сохраняет образ удаления в c: \ temp \ UNINST.ISS, а затем вам необходимо передать его программе удаления, чтобы продукт был удален:

setup.exe /s /f1"UNINST.ISS"

Поэтому я проделал это для всех предыдущих версий нашего продукта, а затем написал пакетный сценарий (с кодом продукта {7F2A0A82-BB08-4062-85F8-F21BFC3F3708}, чтобы выполнить удаление, которое выглядит следующим образом:

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

Проблема в том, что это не работает. Если я выполню удаление из окна CMD с повышенными привилегиями, он будет работать нормально:

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

Но когда я выполняю пакетный сценарий, кажется, что он проходит сразу после удаления и ничего не делает. Итак, я подумал, что попробую написать простую программу на C #, чтобы сделать это, но это тоже не работает:

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

Я попытался отладить это и подтвердил, что текущий каталог правильный (используя Directory.GetCurrentDirectory()), но получаю эту ошибку:

process.StandardError' threw an exception of type 'System.InvalidOperationException'    System.IO.StreamReader {System.InvalidOperationException}

person Ben_G    schedule 15.08.2018    source источник
comment
Эта часть: "/s / f1\".\\Unin.... Вы намеревались оставить пробел между / и f1 там, где его нет в вашем примере командной строки, запускаемом вручную?   -  person gravity    schedule 15.08.2018
comment
Нет - он почему-то попал туда, копируя и вставляя из партии в C #. Было добавлено еще одно место, которое я поймал, но этот ускользнул. Спасибо - похоже, теперь это работает - замечательный глаз!   -  person Ben_G    schedule 15.08.2018


Ответы (2)


Внизу этого PDF-файла есть дополнительные инструкции: https://resources.flexera.com/web/pdf/archive/silent_installs.pdf

setup.exe /s /f1"C:\sample\uninstall.iss" /f2"C:\sample\uninstall.log"

Вы пробовали это вручную с полными путями для параметров /f1 и /f2?

Я активно пытаюсь забыть, как писать командные файлы, но я думаю, что вы можете получить папку, в которой запущен командный файл, вот так:

set here=%~dp0
cd %here%

Может ли изменение имени файла setup.exe вызвать проблемы? Может быть, вы можете попробовать, не меняя имя файла setup.exe, и посмотреть, завершится ли это?

Может ли идея передать команду cmd.exe через параметр / c? (выполняет команду, указанную в строке, а затем завершает):

cmd.exe /c "%here%\setup.exe /s /f1"C:\sample\uninstall.iss" /f2"C:\sample\uninstall.log""

Возможно, попробуйте добавить / SMS-переключатель, чтобы предотвратить преждевременный выход setup.exe до завершения фактического удаления. По слухам, этот переключатель / SMS не нужен для Installshield setup.exe последнего поколения, но он необходим для более старых версий.

person Stein Åsmul    schedule 16.08.2018

Как указала Gravity, проблема заключалась в пробеле между / и f1. Он был добавлен как-то во время вырезания и вставки.

person Ben_G    schedule 16.08.2018