我有一个Visual Studio安装项目。 安装后,它会在应用程序文件夹卸载批处理文件。 如果用户想卸载的产品,他可以去到“添加/删除程序”,或者他可以直接双击uninstall.cmd。 内容是:
%windir%\system32\msiexec /x {CC3EB7BF-DD82-48B9-8EC5-1B0B62B6D285}
该GUID有从Visual Studio中的安装项目的产品代码。
但是,为了升级到正常工作,我必须增加版本号,每次我产生新的MSI时间。 而且,如果我增加版本号,然后我也有生成一个新的GUID的产品代码。 这意味着静态uninstall.cmd文件需要改变。
如何动态生成包含了产品代码,在生成时的批处理文件?
Answer 1:
我发现这个解决方案在这里
“使用Visual Studio 2005/2008,你不需要编写任何代码添加卸载选项安装项目(是的,我知道有些人可以编写代码来做到这一点)
1)在安装项目 - >文件系统窗口 - >右键点击“目标计算机上的文件系统” - >添加一个特殊的文件夹,选择系统文件夹;
2)进入这个系统文件夹添加文件。 浏览当地System32文件夹msiexec.exe的和添加。 覆盖此文件的默认属性如下所示:
条件:=未安装(确保你把“未安装”完全一样,同样的情况下,一切),永久:= True时,系统:=真,传递:=真,生命:=假。
3)在“用户程序菜单”,设定目标,你在第1步,并指出这是在msiexec.exe的创建的系统文件夹下创建一个新的快捷方式。 重命名快捷方式“卸载应用程序”。 设置参数属性/ X {空间} [产品代码]。
4)建设项目,忽略警告有关的事实,MSIEXEC应被排除在外,不排除或安装项目不会建立。
在“未安装”条件和Permananet:=真确保MSIEXEC.EXE仅放置到系统文件夹为一体的部分安装,如果它不存在AREADY,并且它不被除去上卸载 - 因此; S很安全的忽略警告,只是去了。
(从SlapHead的描述基于)”
Answer 2:
我刚做这个工作:
一个uninstall.bat文件添加到您的项目。 该文件的内容是:
msiexec.exe /x %1
建立一个快捷方式到批处理文件(在用户的程序菜单说),请在快捷方式的属性,旁边的参数: [ProductCode]
。
Answer 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文件总是有它的当前产品代码。
这种方法的缺点是什么? 创建该uninstall.cmd脚本保留在安装目录。 不是一个巨大的问题,但我不喜欢在安装目录下的垃圾。 我还没有尝试使“createInstaller.js”自我删除。 这可能会奏效。
编辑 :是的,使得createInstaller.js自我删除工作正常。
我要接受我自己的答案!
Answer 4:
在批处理文件的方式稍有不同。 如果你不希望显示一个命令行窗口,使用方法的wscript文件。 供应[产品代码]如前在参数
<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>
Answer 5:
对于删除该应用程序我会用[产品代码]作为参数,从应用程序本身调用MSIEXEC -进行了详细的指导,以创建卸载程序请查看本博客: http://endofstream.com/creating-uninstaller- IN-A-视觉工作室项目/
Answer 6:
我意识到这个问题已经回答了,但我所做的就是创建一个具有以下内容的批处理文件:
start msiexec.exe /x %1
使用“启动”防止在卸载过程中保持打开,%1由你上执行时将它传递给批处理文件中的第一个参数替换命令提示。
我添加了批处理文件的应用程序文件夹和创建一个指向该批处理文件的菜单快捷方式。 如果你右击该快捷方式,选择属性窗口。 在那里,添加以下文字Arguments属性:
[ProductCode]
构建和运行安装程序后,你就会有一个调用批处理文件,并通过产品代码,因为它是在应用程序的那个版本是建开始菜单快捷方式。 然后,用户将看到一个提示,询问该产品应该被卸载。
这种解决方案的唯一缺点是,如果用户浏览到应用程序文件夹,并双击该批处理文件,卸载程序将给予该安装包不存在的错误。
Answer 7:
我没有接受的答案和锁匠的回答没有看到命令提示符或命令提示符本身的任何闪烁的组合。 做这样的一个亲的是,你没有创建一个快捷方式,以便为它工作设定的参数吧。
我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();
该文件将作为自定义操作在提交行动“目录”。 为了真正得到这个自定义操作:右键单击您的安装项目>视图>自定义操作>右键点击提交“目录”>添加自定义操作。 之后你要搜索的文件createUninstaller.js创建并添加它。
现在让createUninstaller.js读取变量TARGETDIR和产品代码,你必须
右键单击createUninstaller.js在安装项目自定义操作“提交”目录下的文件,去属性窗口。 在属性,你会看到“CustomActionData”属性。 在那里你只需复制粘贴[TARGETDIR] | [产品代码]
瞧! 现在应该添加Uninstall.js文件,你双击它,将尽快工作。
Answer 8:
每次当u生成设置时间,然后随时更改产品代码。 创建一个卸载程序的快捷方式,并有ü会发现排序削减的命令行参数传递技术。 有ü总会写上“/ U产品码”产品代码u需要在这里总是写。
把这个代码的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);
文章来源: In a Visual Studio setup project, How do I generate an uninstall script?