Как настроить Inno Setup, чтобы удалить все?
Я новичок в Inno Setup. Застрял в одной проблеме — как настроить часть удаления для удаления всех файлов, папок, подпапок и даже новых файлов /папок и т. Д., Созданных приложением (другими словами, 100% удаление приложения и связанных файлов). р>
Я охотился здесь, а также на их форуме, и пришел пустой. Кто-нибудь может указать мне документ, FAQ и т. Д. Относительно того, как это сделать?
UPDATE
Спасибо за все отзывы (очень круто). Похоже, я могу удалить все, используя директиву
9 ответов
Возможно, вам следовало сделать этот вопрос совершенно новым, но я также отвечу на ваш обновленный вопрос здесь. Ознакомьтесь с разделом «Сценарии Pascal: код удаления» в документации по настройке Inno.
Чтобы привести пример того, как условно удалить файлы данных в процессе удаления:
Но в зависимости от количества вещей, которые вам нужно почистить, может быть лучше создать специальную вспомогательную программу, которая является частью установки и которая может быть выполнена во время удаления приложения (используя запись в [UninstallRun] ).
Я думаю, что рекомендуемый подход — указать, что нужно удалить в разделе удаления. Причина заключается в том, что если пользователь по какой-либо причине решил поместить в каталог установки свои собственные файлы, которые он не хотел удалять, или сохранил данные, которые он может захотеть сохранить (возможно, их удаление означает установку более новой версии? )
При этом я не знаю, что это за сценарий, но если вы используете ISTool (очень рекомендую), просто зайдите в раздел «Удалить удаление» и добавьте то, что вы хотите удалить. Он должен представить все возможные варианты в хорошем графическом интерфейсе и сгенерировать скрипт для вас.
Изменить: пример из документации по установке Inno:
Но они сильно не делают что-то вроде
ПРИМЕЧАНИЕ. Не пытайтесь использовать здесь подстановочный знак для удаления всех файлов в каталог
. Я настоятельно рекомендую не делать этого на двоих причины. Во-первых, пользователи обычно не ценю наличие их файлов данных они помещают в каталог приложений удаляются без предупреждения (они могут только удалить его, потому что они хочу переместить его на другой диск, например). Лучше оставить до конечных пользователей, чтобы удалить вручную их, если они хотят. Также, если пользователь случилось установить программу в неправильный каталог по ошибке (для например, C: \ WINDOWS) и затем удалить его может быть катастрофическим последствия. Итак, еще раз, не делай этого!
В некоторых случаях требуется удалить файлы, которые изначально не были записаны на диск пользователя во время установки. Один из таких случаев — когда у вас есть приложение, которое обновляется при запуске. Таким способом на диск можно добавлять новые файлы, которые не являются частью деинсталлятора.
В этом случае я предлагаю вам создать файл «патча-манифеста», в котором хранится текущая запись о том, какие файлы должны находиться в каталоге
и образец файла patch_manifest.txt
Примечание. Порядок строк в patch_manifest важен. Сначала должны быть перечислены все файлы в каталоге, а затем каталог — непустые каталоги удалить нельзя.
Ваше приложение должно поставляться с patch_manifest, а patch_manifest должен обновляться с каждым патчем. Сделайте это частью вашего процесса сборки, чтобы не забыть обновить его!
Очень важно, чтобы вы не удаляли по шаблону (. ), даже если вы предлагаете пользователю. У деинсталляторов есть повышенные привилегии, которые потенциально могут уничтожить компьютер пользователя. Возьмите случай с пользователем, который случайно установил ваше приложение в C: \ Windows \ или C: \ Program Files.
Еще одна хорошая идея — проверить, что файл на самом деле является «вашим файлом», выполнив проверку MD5 перед его удалением. В этом случае ваш patch_manifest.txt будет включать не только относительный путь к файлу, но и контрольную сумму MD5.
Это должно сработать:
Вы не можете использовать InnoSetup для удаления чего-либо, что не было установлено, и вам не следует этого делать. Я, например, был бы очень недоволен, если бы я установил приложение, ввел много данных, а затем решил использовать вместо этого что-то еще, что будет считывать эти данные из вашего приложения. Если твоя деинсталляция убила всю работу, которую я уже сделал, я мог бы соблазниться, чтобы найти тебя. И, вероятно, не купить вам чашку кофе.
Или рассмотрим случай, когда я устанавливаю ваше приложение в процессе оценки нескольких. Я пробую приложения и продолжаю возвращаться к вашим, потому что они мне нравятся немного лучше, и каждый раз я ввожу больше данных. Затем я решаю ничего не делать, поэтому удаляю все тестовые приложения. Через неделю я решаю, что теперь мне нужно использовать ваше приложение, и переустанавливаю его. К сожалению! Вся работа, которую я выполнял, проверяя то, что я теперь хотел использовать, ушла.
Вышесказанное объясняет, почему при удалении приложения оно оставляет после себя все, что вы создали в папках, например, файлы конфигурации, файлы данных и т. д. Оно не знает, что вы хотите с ним делать, поэтому оно оставляет их одни.
Разве это не значение по умолчанию, если вы не указываете «uninsneveruninstall» для записи?
edit — Извините, я не понял, что вы говорите о недавно созданных файлах данных.
Я хотел удалить gData.dat , созданный во время выполнения в установленной папке
и у меня все работало нормально
Добавьте элемент удаления файла /папки в Inno Setup studio. Или напрямую используйте скрипт следующим образом.
Inno Setup [UninstallDelete] удалить все, кроме одной папки
Для установки и развертывания моего приложения я использую Inno-Setup 5.5.4. Моя текущая структура установки следующая:
После удаления приложения я хочу удалить все возможные файлы, которые могут быть созданы приложением, кроме тех, которые находятся в определенной папке. (т.е. C:\MyApp\FolderA\NewFile.txt ).
Моя первая попытка — создать по одной записи для каждой папки, которую я хочу очистить, в разделе [UninstallDelete]. Примерно так:
Однако мне не нравится это решение, поскольку мне приходится рассматривать возможность изменения установщика каждый раз, когда я добавляю новую папку в приложение.
Второй подход — удалить конкретную папку, только если она пуста, а затем установить корневую папку приложения для удаления. Примерно так:
Будет ли работать этот второй подход? Есть ли более разумный способ добиться этого?
2 ответа
Файл не может быть удален, когда к нему обращается процесс. Найдите причину, которая его вызывает. Закройте все приложения и службы, которые собираются удалить до начала удаления папок. Убедитесь, что нет других приложений, обращающихся к файлам, которые вы собираетесь удалить (блокнот, Word и т. Д.). Иногда полезно подождать несколько секунд после завершения других процессов, прежде чем удалять файлы, которые они использовали (может быть, кто-то еще может объяснить это).
У меня однажды был случай, когда мы не могли найти причину, по которой файл не может быть удален деинсталлятором. Спустя долгое время мы обнаружили, что запущенный apachemonitor.exe обращается к файлу журнала, и мы не убивали этот процесс раньше. Найти блокирующий процесс может быть довольно сложно, но особенно если это всегда один и тот же файл, который нельзя удалить, вам лучше поискать процессы, которые вы устанавливаете и используете, чтобы создать правильно работающий деинсталлятор.
Если вы хотите удалить все файлы в папке, кроме специальной, вам следует использовать Pascal-Script в своем деинсталляторе. Ссылка на функцию (http://www.jrsoftware.org/ishelp/index.php ? topic = scriptfunctions) здесь очень помогает.
Вы можете использовать FindFirst , FindNext , FindClose для перебора каталога. Звоните DelTree(DirName, true, true, true) или DeleteFile , чтобы узнать все элементы, которые вы хотите удалить.
Выполните этот код внутри события CurUninstallStepChanged , если CurUninstallStep=usPostUninstall .
Другой способ предотвратить удаление файлов при удалении — используйте параметр Flags:
uninsneveruninstall; в разделе [Файлы]
Информация из справки:
Никогда не удаляйте файл. Этот флаг может быть полезен при установке очень распространенных общих файлов, которые не следует удалять ни при каких обстоятельствах, таких как библиотеки DLL MFC.
Примечание : если этот флаг сочетается с флагом sharedfile, файл никогда не будет удален во время удаления, но счетчик ссылок все равно будет правильно уменьшен.
Как удалить приложение Inno Setup из пакета Wix
Мой пакет Wix устанавливает несколько сторонних EXE-пакетов, которые входят в пакет установки Inno. Как вы знаете, деинсталлятор Inno Setup — это отдельный исполняемый файл. В основном, когда вы устанавливаете AThirdParty.EXE — он создает unin000.exe в своей развернутой папке (например, C: \ Program Files (x86) \ AThirdPartyApp \ unins000.exe), и это то, что мне нужно выполнить во время удаления моего пакета .. Кто-нибудь знает, как это сделать с Wix Bootstrapper?
Ниже приведен пример моего ExePackage:
AThirdPartyExe.exe не поддерживает / UNINSTALL / VERYSILENT / SUPPRESSMSGBOXES?
Нет, не поддерживает AThirdPartyExe.exe / УДАЛИТЬ.
Есть ли какое-то коммерческое оправдание, чтобы просто пометить этот пакет как постоянный и не беспокоиться об удалении? (Например, установка .NET или VCRedist.)
«постоянная» установка — это текущее поведение. Я просто люблю убирать за собой, если это возможно 🙂



Ответы 1
Предполагая, что Inno Setup не поддерживает флаг / uninstall (не знаю, но если это еще одна причина использовать только MSI), и вы не хотите переупаковывать установщик в MSI, самое быстрое решение, которое я могу придумать, — это человек в средний EXE.
InstallShield имел обыкновение (может все еще) иметь Helper.exe для некоторых предварительных условий установки. Вы могли бы закодировать его, чтобы он принимал аргументы / INSTALL и / UNINSTALL и вместо этого вызывал WiX. Это, в свою очередь, вызовет фактическую установку и удаление, как вы описали выше.
Спасибо @Christopher Painter. Я боялся, что «человек посередине EXE» будет единственным вариантом в этом случае. Я не контролирую оригинальный AThirdPartyExe.exe и не могу перепаковать его как MSI. Так как же будет выглядеть тег <ExePackage? Я предполагаю, что SourceFile = «. \ ManInTheMiddle.exe» и InstallCommand = «. \ AThirdPartyExe.exe / VERYSILENT / SUPPRESSMSGBOXES». Будет ли Wix burn знать, как получить доступ к. \ AThirdPartyExe.exe? Я имею в виду, как бы я упаковал его в свой пакет?
InstallCommand будет просто / INSTALL, а MainInTheMiddle выполнит процесс. Начните с AThirdPartyExe.exe / VS / SUP . Вам нужно будет использовать элемент Payload, чтобы сообщить прожигу, что нужно взять с собой исполняемый файл ThirdParty.
Пакеты Inno Setup могут быть удалены по умолчанию (если пакет не имеет Uninstallable=yes , настроенного в разделе [Setup] ). Просто запустите исполняемый файл деинсталлятора (обычно unins000.exe ). Поскольку вы, вероятно, захотите удалить установку без помощи рук, вы должны использовать параметр /silent или /verysilent и, возможно, также и /suppressmsgboxes (подробности см. В документация).
@Bill_Stewart проблема в том, что unins000.exe — это отдельный исполняемый файл. По замыслу Wix хочет запустить основной исполняемый файл с параметрами командной строки для удаления программы.
Вы можете сделать это с помощью AppId установленного пакета и посмотреть в реестре командную строку удаления.
@Bill_Stewart, но в командной строке удаления используется другой исполняемый файл (unins000.exe). Так что я не понимаю, как это могло сработать. Предполагая, что у вас есть командная строка удаления, можете ли вы предоставить пример тега ExePackage? Как бы вы сказали пакету Wix выполнить эту командную строку? Пакет Wix не поддерживает настраиваемые действия
Я говорю, что обе команды InstallCommand и UninstallCommand вызывают Helper / MITM EXE. Затем он может вызвать установочный exe и удалить exe без ведома WiX.