Как создать сценарий удаления в проекте установки Visual Studio? - PullRequest
27 голосов
/ 31 августа 2009

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

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

GUID, который есть ProductCode из проекта установки в Visual Studio.

ProductCode

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

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

Ответы [ 8 ]

65 голосов
/ 02 сентября 2009

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

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

1) В проекте установки -> окна файловой системы -> щелкните правой кнопкой мыши «Файловая система на целевом компьютере» -> добавьте специальную папку, выберите «Системная папка»;

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

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

.

3) Создайте новый ярлык в «Меню программы пользователя», установите «Цель» на системную папку, созданную на шаге 1. и укажите ее на msiexec.exe. Переименуйте ярлык в «Удалить приложение». Установите для свойства Arguments значение /xndomspace coming[ProductCode].

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

Условие «Not Installed» и Permananet: = True гарантируют, что файл msiexec.exe будет помещен в системную папку только как часть установки, ЕСЛИ он уже не существует и не удаляется при удалении - поэтому довольно безопасно игнорировать это предупреждение и просто пойти на это.

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

11 голосов
/ 23 апреля 2011

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

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

msiexec.exe /x %1

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

3 голосов
/ 31 августа 2009

Это сценарий, который я написал, который создает 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-файл, в котором всегда содержится текущий код продукта.

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

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

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

2 голосов
/ 27 января 2012

небольшое изменение в подходе пакетного файла. если вы не хотите показывать командное окно, используйте файл 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>
1 голос
/ 25 июля 2018

Я сделал комбинацию принятого ответа и ответа Слесаря, чтобы не видеть никаких всплесков командной строки или самой командной строки. Один из доводов в пользу того, чтобы сделать это, это то, что вы НЕ ДОЛЖНЫ создавать ярлык и устанавливать для него аргументы, чтобы он работал.

Мой файл createUninstaller.js:

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.js", ForWriting, true);

ts.WriteLine("var v = new ActiveXObject(\"Shell.Application\");");
ts.WriteLine("v.ShellExecute(\"msiexec.exe\", \"/x "+productCode+"\", \"\", \"open\",10);");
ts.Close();

Этот файл добавляется как пользовательское действие в действие коммита 'directory'. Для того, чтобы на самом деле добраться до этих пользовательских действий: щелкните правой кнопкой мыши ваш проект установки> просмотр> настраиваемые действия> щелкните правой кнопкой мыши фиксацию «каталог»> добавьте настраиваемое действие. После того, как вам нужно найти созданный вами файл createUninstaller.js и добавить его.

Теперь, чтобы файл createUninstaller.js считал переменные targetDir и productCode, вам необходимо
Щелкните правой кнопкой мыши файл createUninstaller.js в пользовательском действии проекта установки 'commit' каталог и перейдите в окно свойств. В свойствах вы увидите свойство «CustomActionData». Там вы просто копируете вставить [TARGETDIR] | [ProductCode]
И ВОЙЛА! Теперь он должен добавить файл Uninstall.js, который будет работать, как только вы дважды щелкните по нему.

1 голос
/ 07 марта 2013

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

start msiexec.exe /x %1

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

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

[ProductCode]

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

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

1 голос
/ 30 августа 2010

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

0 голосов
/ 29 января 2013

каждый раз, когда вы генерируете настройки, всегда меняйте код продукта. создайте ярлык удаления, и там вы найдете метод передачи аргументов командной строки для сортировки вырезок. там вы всегда будете писать «/ 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...