Подтвердить что ты не робот

В проекте установки Visual Studio, как мне создать деинсталляцию script?

У меня есть проект установки Visual Studio. После установки создается пакетный файл деинсталляции в папке приложения. Если пользователь хочет удалить продукт, он может перейти на "Установка и удаление программ", или он может просто дважды щелкнуть файл uninstall.cmd. Содержимое:

%windir%\system32\msiexec /x {CC3EB7BF-DD82-48B9-8EC5-1B0B62B6D285}

В GUID находится ProductCode из Project Setup в Visual Studio.

ProductCode http://i32.tinypic.com/2uhwapy.jpg

Но для того, чтобы обновления работали правильно, я должен увеличивать номер версии каждый раз, когда я создаю новый MSI. И, если я увеличиваю номер версии, я также должен создать новый Guid для ProductCode. Это означает, что статический файл uninstall.cmd необходимо изменить.

Как я могу динамически генерировать командный файл, содержащий ProductCode, во время сборки?

4b9b3361

Ответ 1

Это script Я написал, что создает uninstall.cmd. Он запускается как пользовательское действие во время установки.

var fso, ts;
var ForWriting= 2;
fso = new ActiveXObject("Scripting.FileSystemObject");

var parameters = Session.Property("CustomActionData").split("|"); 
var targetDir = parameters[0];
var productCode = parameters[1];

ts = fso.OpenTextFile(targetDir + "uninstall.cmd", ForWriting, true);

ts.WriteLine("@echo off");
ts.WriteLine("goto START");
ts.WriteLine("=======================================================");
ts.WriteBlankLines(1);
ts.WriteLine(" Uninstall.cmd");
ts.WriteBlankLines(1);
ts.WriteLine("=======================================================");
ts.WriteBlankLines(1);
ts.WriteLine(":START");
ts.WriteLine("@REM The uuid is the 'ProductCode' in the Visual Studio setup project");
ts.WriteLine("%windir%\\system32\\msiexec /x " + productCode);
ts.WriteBlankLines(1);
ts.Close();

Результат - это cmd файл, в котором всегда есть текущий ProductCode.

Недостатком этого является то, что script, который создает файл uninstall.cmd, остается в каталоге установки. Не большая проблема, но мне не нравится мусор в каталоге установки. Я еще не попытался сделать самосохранение "createInstaller.js". Это может сработать.

РЕДАКТИРОВАТЬ: да, что делает самоисполнение createInstaller.js прекрасным.

Я собираюсь принять свой собственный ответ!

Ответ 2

Я нашел это решение здесь

"Используя Visual Studio 2005/2008, вам не нужно писать какой-либо код, чтобы добавить параметр удаления для проекта установки (да, я знаю, что некоторые люди могут писать код для этого)

1) В окне Setup Project → File System → Щелкните правой кнопкой мыши "Файловая система на целевой машине" → добавьте специальную папку, выберите System Folder;

2) В эту системную папку Добавить файл. Найдите msiexec.exe из локальной папки System32 и добавьте его. Переопределите свойства по умолчанию для этого файла следующим образом:

Условие: = Не установлено (убедитесь, что вы поставили "Не установлено точно так же, как и все, что угодно", Постоянный: = True, Система: = True, Переходная: = True, Vital:. = False

3) Создайте новый ярлык в меню "Меню пользователей", установите цель в системную папку, созданную на шаге 1. и укажите ее в файле msiexec.exe. Переименуйте ярлык на "Удалить приложение". Задайте для свойства Arguments значение /x {пробел} [ProductCode].

4) Создайте проект, проигнорируйте предупреждение о том, что msiexec следует исключить, DONT исключает его или проект установки не будет создавать.

"Не установленное условие и Перманент: = True" убедитесь, что msiexec.exe помещается только в системную папку как часть установки, если он не существует, и он не удаляется при удалении - поэтому он довольно безопасно игнорировать это предупреждение и просто пойти на это.

(На основе описания из SlapHead) "

Ответ 3

Я только что сделал эту работу:

Добавьте файл uninstall.bat в свой проект. Содержимое файла:

msiexec.exe /x %1

Сделайте ярлык для этого командного файла (например, в меню программы пользователя), укажите в свойствах ярлыка рядом с аргументами: [ProductCode].

Ответ 4

Для удаления приложения я бы использовал [ProductCode] в качестве параметра, вызывая msiexec из самого приложения - для подробного руководства по созданию деинсталлятора, пожалуйста, просмотрите этот блог: http://endofstream.com/creating-uninstaller-in-a-visual-studio-project/

Ответ 5

небольшое отклонение от подхода пакетного файла. если вы не хотите показывать окно команд, используйте файл wscript. поставьте [ProductCode], как прежде, в Аргументы

<job>
<?job debug="true" error="true" ?>
<script language="JScript">
    var arg = [];
    for (var i=0; i<WSH.Arguments.length; i++) {
        arg.push( WSH.Arguments.Item(i) );
    }

    if (arg.length>0) {
        var productcode = arg[0];
        var v = new ActiveXObject("Shell.Application");
        v.ShellExecute("msiexec.exe", "/x "+productcode, "", "open", 10);
    }

    WSH.Quit(0);
</script>
</job>

Ответ 6

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

start msiexec.exe /x %1

Использование "start" предотвращает остановку командной строки во время процесса удаления, а% 1 заменяется первым аргументом, который вы передаете в пакетный файл при его выполнении.

Я добавил командный файл в папку приложения и создал ярлык меню, указывающий на командный файл. Если вы щелкните правой кнопкой мыши ярлык и выберите "Окно свойств". Там добавьте следующий текст в свойство Arguments:

[ProductCode]

После создания и запуска установщика у вас будет ярлык меню "Пуск", который вызывает пакетный файл и передает код продукта, как это было при создании этой версии приложения. Затем пользователь увидит запрос о необходимости удаления продукта.

Единственным недостатком этого решения является то, что если пользователь просматривает папку приложения и дважды нажимает на пакетный файл, деинсталлятор выдаст сообщение об ошибке, что пакет установки не существует.

Ответ 7

каждый раз, когда вы создаете настройку, всегда меняйте код продукта. создайте ярлык для удаления, и там вы найдете метод передачи аргументов командной строки для сортировки cut. там u будет всегда писать код кода "/u product code", который нужно писать здесь всегда.

поместите этот код в основной метод файла program.cs

[STAThread]
        static void Main()
        {
            bool flag = true;
            string[] arguements = Environment.GetCommandLineArgs();
            foreach (string str in arguements)
            {
                if ((str.Split('='))[0].ToLower() == "/u")
                {
                    if (MessageBox.Show("Do you want to uninstall job board", "Are you Sure?", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        flag = false;
                        RemoveRegSettings();
                        RemoveIniFile();
                        string guid = str.Split('=')[1];
                        string path = Environment.GetFolderPath(Environment.SpecialFolder.System);
                        ProcessStartInfo si = new ProcessStartInfo(path + @"\msiexec.exe", "/i" + guid);
                        Process.Start(si);
                        Application.Exit();
                        return;
                    }
                }
            }
            //

            //************************************************
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);