25

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

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

GUID - это код продукта из проекта установки в Visual Studio.

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

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

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

ответ

2

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

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

EDIT: yes, что делает self-deleting createInstaller.js прекрасным.

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

+1

Прекрасное решение, но черт побери, я задаюсь вопросом о Microsoft, установщиках, которые я пробовал раньше (такие inno), что делал unistall файл автоматически. – Cynede

+1

Я знаю, что прошло несколько лет, но я хотел бы знать, как именно ты об этом пользуешься, Чисо. Вы переопределяете 'OnAfterInstall'? Если да, то как вы вставляете Script там? – jp2code

63

Я нашел это решение here

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

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

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

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

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

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

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

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

+1

Теперь это очень удобно и гораздо более прямолинейно, чем подход, который я принял. – Cheeso

+8

Awesome, отлично работает для меня на WinXP/Vista и Win7. Стоит отметить, что согласно статье, связанной с, если вы используете версию msiexec.exe HIGHER, чем целевую платформу, есть проблемы. Для меня это не проблема, поскольку я все еще намеренно использую XP для создания, но, очевидно, если вы хотите, чтобы установщик, построенный на Vista, работал на XP, это будет проблемой. –

+0

Отличный пост! Именно то, что я искал. – Martin

1

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

+0

Ссылка мертва. – JerryOL

10

Я только что сделал this работы:.

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

msiexec.exe /x %1 

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

+1

Вы можете избавиться от черного окна, используя 'start msiexec.exe/x% 1'; но черное окно все еще мигает. – moala

+0

Возможно 'start/B msiexec.exe/x% 1'. – MPelletier

+0

no, nor '/ b' ... – moala

1

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

каждый раз, когда вы создаете установку, всегда меняйте код продукта. создайте ярлык для удаления, и там вы найдете метод передачи аргументов командной строки для сортировки 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); 
1

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

start msiexec.exe /x %1 

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

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

[ProductCode] 

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

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

Смежные вопросы