WISE Uninstaller не удаляет себя - PullRequest
2 голосов
/ 18 января 2011

Я знаю, я знаю ... прекрати использовать WISE.Это на самом деле не вариант для меня прямо сейчас.У нас слишком много на нашей тарелке, чтобы написать совершенно новый установщик и изменить весь наш процесс сборки, что и должно быть сделано.

В ЛЮБОМ СЛУЧАЕ, проблема в том, что наш деинсталлятор EXE не удаляет себя, когдадеинсталлировать.Он находится в папке Program Files, где установлено наше приложение.После завершения удаления мы хотим, чтобы все файлы были удалены, а папка приложения - удалена.Вместо этого деинсталлятор остается вместе с папкой приложения, поскольку он не может удалить себя во время работы.

Это похоже на элементарную задачу, поскольку все другие программы, установленные на моем компьютере, имеют свои деинсталляторынаходится в папке «Program Files», и они удаляются после удаления, но я не могу найти кого-то еще с такой же проблемой через Google.Для меня имеет смысл, что файл не может быть удален, так как он в настоящее время загружен в память, но * нытье * все остальные делают это ... почему я не могу?

РЕДАКТИРОВАТЬ: Если это поможет, я запускаю Wise Installation Studio 7.0 и изменяю скрипт удаления в редакторе пакетов WiseScript.Часть, которая удаляет папку Program Files, выглядит как Delete File(s) %MAINDIR%\*.*, где% MAINDIR% - это папка приложения в Program Files.У этой команды есть две опции (обе включены) - Включить подкаталоги и Удалить файлы, содержащие каталог.

Ответы [ 2 ]

2 голосов
/ 20 января 2011

В итоге я воссоздал то, что делают лучшие установщики.У меня есть проверка деинсталлятора, чтобы увидеть, работает ли он из каталога% TEMP%, и если это не так, я советую ему скопировать себя во временную папку и запустить оттуда.Затем я отмечаю тот файл во временной папке, который будет удален при перезагрузке, добавив его в раздел реестра:

HKLM\System\CurrentControlSet\Control\Session Manager\PendingFileRenameOperations

@ altie: Возможно, ваше решение будетсработало, но я думаю, что мне больше нравится это решение.Кажется, чище и надежнее.Но большое спасибо за предоставленный пример кода ... Я иногда пишу командные файлы и не знал циклов или команды "tasklist".Это может оказаться полезным в будущем!

1 голос
/ 18 января 2011

Если вы не можете найти какой-то другой способ сделать это, вот вам подвох: сделайте последний шаг в вашем установщике, чтобы запустить cmd.exe, который ожидает завершения вашего процесса Wise, а затем удалите его.

Пример того, как сделать это в пакетном скрипте со списком задач:

rem Expand variables delayed with !! syntax for for loop
setlocal EnableExtensions EnableDelayedExpansion

rem Create a loop with a label and goto
:loopstart
for /F "delims= " %%a in ('tasklist /FI "imagename eq wiseuninstaller.exe"') do (
   if not "%%a"=="INFO: No tasks are running which match the specified criteria." (
      set stillrunning=no
   ) else (
      set stillrunning=yes

      rem Add a 5 second delay with ping and throw out the output.
      ping -n 5 > NUL 2>&1
   )
)

if "!stillrunning!"=="yes" goto :loopstart

del wiseuninstaller.exe

Я не тестировал этот код и не проверял его на наличие синтаксических ошибок, но он близок.for /? и tasklist /? из командной строки могут помочь вам понять, как настроить это в соответствии с вашими потребностями.

...