В проекте установки 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, во время сборки?
Ответы
Ответ 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);