C#卸载软件
打开控制面板-程序和功能,里面能看到想要卸载的软件名称
根据DisplayName就能找到UninstallString
public static string GetProductGuid(string displayName) { string productGuid = string.Empty; string bit32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
//注意 64位的程序还可能在: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
RegistryKey localMachine = Registry.LocalMachine; RegistryKey unistall = localMachine.OpenSubKey(bit32, true); var subNames = unistall.GetSubKeyNames(); foreach (string subkey in subNames) { RegistryKey product = unistall.OpenSubKey(subkey); try { if (product.GetValueNames().Any(n => n == "DisplayName") == true) { string tempDisplayName = product.GetValue("DisplayName").ToString(); if (tempDisplayName == displayName && product.GetValueNames().Any(n => n == "UninstallString") == true) { var unitstallStr = product.GetValue("UninstallString").ToString(); //注意:如果不包含MsiExec,可以返回unitstallStr if (unitstallStr.Contains("MsiExec.exe")) { string[] strs = unitstallStr.Split(new char[2] { '{', '}' }); productGuid = strs[1]; break; } } } } catch { return string.Empty; } } return productGuid; }
如果找不到,就要手动在注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 下面找到DisplayName和卸载字符串
卸载
Process p = new Process(); p.StartInfo.FileName = "msiexec.exe"; //用 /i 替换 /x 就不会弹出提示框 “您确定要卸载此产品吗?” p.StartInfo.Arguments = "/x {72D96FC3-7E2F-448B-86DA-4CB1C8882407}"; p.Start();
或
Process p = new Process(); p.StartInfo.FileName=@"C:\Program Files (x86)\InstallShield Installation Information\{05B77F59-5655-4E62-8139-BD9E400D8D15}\setup.exe" ; p.StartInfo.Arguments=" -runfromtemp -l0x0409 -removeonly"; p.Start();
当我们把 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall 中的所有注册表项都浏览一遍后,发现在控制面板的“添加删除程序”列表中的应用程序好像并没有全部显示在这里,例如我们常用的 Office 系列就找不到相应的注册表项。这是怎么回事呢?
原来,还有其它两个注册表项用来保存已注册的应用程序信息,它们就是 HKEY_CLASSES_ROOT/Installer/Products 和 HKEY_CURRENT_USER/Software/Microsoft/Installer/Products 。如果我们把这三个注册表项定义的全部应用程序都加在一起,就是我们在“添加删除程序”列表中看到的所有程序了。
HKEY_CLASSES_ROOT/Installer/Products 和 HKEY_CURRENT_USER/Software/Microsoft/Installer/Products 主要用来保存那些基于 Windows Installer 安装的应用程序,例如 Office;而 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Uninstall 则主要用来保存那些基于其它安装程序的应用程序,例如常见的基于 InstallShield 安装的应用程序。
msiexec安装参数详解
1 安装
/i表示安装,/x 表示卸载/f表示修复。/l*v 表示输出详细日志
安装参数有
/qn 无用户界面;/qb 基本界面; /qr 精简界面;/qf 完整界面(默认值)
/q 设置 UI 级别。
q、qn - 没有 UI。
qb 基本 UI。
qr 简化的 UI。 在安装结束时显示 一个模式对话框。
qf 完整 UI。在安装结束时显示 一个模式对话框。
qn+ 没有 UI。但是,在安装结束时显示一个模式对话框。
qb+ 基本 UI。在安装结束时显示一个模式对话框。如果取消安装,将不显示模式对话框。
qb- 不带模式对话框的基本 UI。
qb+-开关不是一个受支持的 UI 级别。
下面以安装msicreate.msi为例
(1)/qn
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qn /l*v msiexec_log.txt
执行后软件自动装上,没有跳出任何安装界面,在和bat文件相同目录的位置出现日志。
(2)/qb
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qb /l*v msiexec_log.txt
只跳出上图的安装界面,之后没有任何界面,期间无需用户操作,安装完全自动完成。
(3)/qr
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qr /l*v msiexec_log.txt
只出现上面的界面,无需用户交互,安装自动完成
(4)/qf
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qf /l*v msiexec_log.txt
出现上图,需要用户交互操作,才能完成安装。(默认的安装方式,和不加任何安装参数效果一样)
(5)/qn+
msiexec /i\\troy\ISO_ISO\tools\msicreate.msi /qn+ /l*v msiexec_log.txt
和/qn的区别是安装结束后会出现上图的成功安装对话框
(6)/qb+
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qb+ /l*v msiexec_log.txt
和/qb之间的差别是在安装结束之后,会跳出安装成功的对话框。
(7)/qb-
msiexec /i\\troy\ISO_ISO\tools\msicreate.msi /qb- /l*v msiexec_log.txt
没看出和/qb之间的区别
(8)/qb+-
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qb+- /l*v msiexec_log.txt
没看出和/qb+-之间的区别
另外,在默认安装的时候只是针对当前用户的,而非admin的时候。如果要对所有用户的话,就要用到ALLUSERS=1,如:
msiexec /i \\troy\ISO_ISO\tools\msicreate.msi /qb+- /l*v msiexec_log.txt ALLUSERS=1