Удаление программы InstallShield Installscript MSI с использованием C# в автоматическом режиме
Это будет очень специфично для InstallShield, поэтому я сомневаюсь, что кто-то имел дело с этим раньше, но я написал пакетный файл для удаления предыдущих версий нашего продукта, и он не работает. (Мы всегда удаляем предыдущие версии перед установкой / обновлением, поскольку обновления в InstallShield не работают). Деинсталляция MSI-проектов Installscript сильно отличается от типичных деинсталляций тем, что вам нужно "записать" деинсталляцию и сохранить результаты в файле, т.е.
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}
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 последнего поколения, но он необходим для более старых версий.
Как указал Гравити, проблема заключалась в том, что между / и f1 было пространство. Это было добавлено как-то во время вырезания и вставки.