在Visual Studio安装项目中,如何生成卸载脚本?

时间:2009-08-31 06:57:29

标签: visual-studio visual-studio-2008 installation setup-project

我有一个Visual Studio安装项目。 安装后,它会在应用程序文件夹中创建卸载批处理文件。如果用户想要卸载产品,他可以转到“添加/删除程序”,或者只需双击uninstall.cmd即可。内容如下:

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

GUID是Visual Studio中安装项目的ProductCode。

ProductCode

但是,为了使升级正常工作,我每次生成新的MSI时都必须增加版本号。而且,如果我增加版本号,那么我还必须为ProductCode生成一个新的Guid。这意味着静态uninstall.cmd文件需要更改。

如何在构建时动态生成包含ProductCode的批处理文件?

8 个答案:

答案 0 :(得分:65)

我找到了这个解决方案here

“使用Visual Studio 2005/2008,您不需要编写任何代码来为安装项目添加卸载选项(是的,我知道有些人可以编写代码来执行此操作)

1)在安装项目中 - >文件系统窗口 - >右键单击“目标机器上的文件系统” - >添加特殊文件夹,选择系统文件夹;

2)进入此系统文件夹添加文件。从本地System32文件夹中浏览msiexec.exe并添加它。覆盖此文件的默认属性,如下所示:

条件:=未安装(请确保将“未安装”完全相同,相同的情况和所有内容), 永久:=真, 系统:= TRUE, 传递:= TRUE, 重要:=假

3)在“用户程序菜单”下创建一个新快捷方式,将目标设置为您在步骤1中创建的系统文件夹,并将其指向msiexec.exe。将快捷方式重命名为“卸载应用程序”。将Arguments属性设置为/ x {space} [ProductCode]。

4)构建项目,忽略有关msiexec应被排除,不要排除它或安装项目不会构建的事实的警告。

“未安装”条件和Permananet:= True确保msiexec.exe仅作为安装的一部分放入系统文件夹中,如果它不存在,并且在卸载时不会删除它 - 因此它是非常安全的,可以忽略那个警告而只是去做吧。

(基于SlapHead的描述)“

答案 1 :(得分:11)

我刚刚让this工作:

将uninstall.bat文件添加到项目中。文件内容为:

msiexec.exe /x %1

创建该批处理文件的快捷方式(例如在用户程序菜单中),在快捷方式的属性中指定参数:[ProductCode]旁边。

答案 2 :(得分:3)

这是我编写的创建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”自行删除。那可能有用。

编辑:是的,使createInstaller.js自我删除工作正常。

我将接受我自己的答案!

答案 3 :(得分:2)

批处理文件方法略有不同。如果您不想显示命令窗口,请使用wscript文件。像以前一样在[Arguments]中提供[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>

答案 4 :(得分:1)

要删除应用程序,我会使用[ProductCode]作为参数,从应用程序本身调用msiexec - 有关创建卸载程序的详细指南,请查看此博客:http://endofstream.com/creating-uninstaller-in-a-visual-studio-project/

答案 5 :(得分:1)

我意识到这个问题已经得到解答,但我所做的是创建一个包含以下内容的批处理文件:

start msiexec.exe /x %1

使用“start”可防止命令提示符在卸载过程中保持打开状态,%1将被执行时传递给批处理文件的第一个参数替换。

我将批处理文件添加到应用程序文件夹,并创建了一个指向批处理文件的菜单快捷方式。如果右键单击快捷方式并选择“属性窗口”。在那里,将以下文本添加到Arguments属性:

[ProductCode]

在构建并运行安装程序之后,您将拥有一个开始菜单快捷方式,该快捷方式调用批处理文件并传递产品代码,就像构建该应用程序版本时一样。然后,用户将看到询问是否应该卸载产品的提示。

此解决方案的唯一缺点是,如果用户浏览应用程序文件夹并双击批处理文件,则卸载程序将发出安装包不存在的错误。

答案 6 :(得分:1)

我结合了接受的答案和Locksmith的答案,没有看到命令提示符或命令提示符本身的任何闪烁。这样做的一个优点是,您不必创建快捷方式并为其设置参数以使其起作用。

我的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();

此文件作为自定义操作添加到提交操作“目录”中。为了真正地执行此自定义操作: 右键单击您的安装项目>视图>自定义操作>右键单击commit'directory'>添加自定义操作。在必须搜索创建的createUninstaller.js文件并将其添加之后。

现在要使createUninstaller.js读取变量targetDir和productCode
右键单击安装项目自定义操作中的createUninstaller.js文件 “提交”目录并转到属性窗口。 在属性中,您将看到“ CustomActionData”属性。您只需在其中复制粘贴[TARGETDIR] | [ProductCode]
和VOILA!现在,它应该添加Uninstall.js文件,双击该文件即可使用。

答案 7 :(得分:0)

每当您生成设置时,请始终更改产品代码。创建一个卸载程序快捷方式,你会发现命令行参数传递技术来排序切割。在那里你总是写“/ u产品代码”产品代码,你需要在这里写。

将此代码放在program.cs文件的main方法中

[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);