C#_自动化测试 (四) 自动卸载软件
在平常的测试工作中,经常要安装软件,卸载软件, 即繁琐又累。 安装和卸载完全可以做成自动化。 安装软件我们可以通过自动化框架,自动点击Next,来自动安装。 卸载软件我们可以通过msiexec命令行工具自动化卸载软件
阅读目录
- 用msiexec 命令来卸载软件
- 注册表中查找ProductCode
- C#中自动卸载软件
- C#查找注册表中的ProductCode
- 完整源代码下载
用msiexec 命令来卸载软件
平常我们手动卸载软件都是到控制面板中的"添加/删除"程序中去卸载软件, 或者通过程序自带的卸载软件来卸载。
我们可以通过 MsiExec.exe /X{ProductCode} 命令来卸载程序。
关于MsiExec.exe 请看 http://technet.microsoft.com/zh-cn/library/cc759262%28v=WS.10%29.aspx
注册表中查找ProductCode
ProductCode是Windows 安装程序包的全局唯一标识符 (GUID), 我们可以通过注册表来获取ProductCode
实例: 用MsiExec.exe 自动卸载Xmarks.
Xmarks 是一个用来同步收藏夹的工具, 我平常用来同步IE,firefox,chrome的收藏夹。
先用注册表打开如下位置,
32位操作系统: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
注意: 如果是64位操作系统:
64位的程序还在: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\
32位的程序而是在: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\
Uninstall下面的注册表子键很多, 你需要耐心地一个一个去查找"DisplayName", 从而找到程序的ProductCode, 如下图。
从注册表中我们找到UninstallString这个键值: MsiExec.exe /X{C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF}, 那么ProductCode就是{C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF}
我们可以通过 MsiExec.exe /X{ProductCode} 命令来卸载程序.
那么卸载的命令应该为 MsiExec.exe /X{C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF}
然后在CMD中直接调用这个命令, 会弹出一个对话框,点击"是" 后, 软件就能被卸载了。
在自动化测试中,我们不想弹出这个对话框,而是希望直接卸载。同时也不希望系统重启 只要加个两个参数 /quiet /norestart 就可以了
现在的卸载的命令是: MsiExec.exe /X{C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF} /quiet
C#中卸载程序
C#的卸载代码比较简单, 当然你也可以用其他语言。
Process p = new Process();p.StartInfo.FileName = "msiexec.exe"; p.StartInfo.Arguments = "/x {C56BBAC8-0DD2-4CE4-86E0-F2BDEABDD0CF} /quiet /norestart"; p.Start();
C#查找注册表中的ProductCode
最麻烦的在于,如何到注册表中获取ProductCode。 如果做非Web程序的自动化测试,经常需要跟注册表打交道。
代码为:
public static string GetProductCode(string displayName){string productCode = string.Empty; // 如果是32位操作系统,(或者系统是64位,程序也是64位) string bit32 = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"; // 如果操作系统是64位并且程序是32位的 string bit64 = @"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall"; RegistryKey localMachine = Registry.LocalMachine; RegistryKey Uninstall = localMachine.OpenSubKey(bit32, true); foreach (string subkey in Uninstall.GetSubKeyNames()) { RegistryKey productcode = Uninstall.OpenSubKey(subkey); try { string displayname = productcode.GetValue("DisplayName").ToString(); if (displayname == displayName) { string uninstallString = productcode.GetValue("UninstallString").ToString(); string[] strs = uninstallString.Split(new char[2] { '{', '}' }); productCode = strs[1]; return productCode; } } catch { } } return productCode; }
完整的源代码下载
点击此处下载完整源代码, 请用vs2010以上打开
附: 自动化测试 系列教程, (连载中, 敬请期待)
自动化测试 (一) 12306火车票网站自动登录工具
自动化测试 (二) 连连看外挂
自动化测试 (三) Web自动化测试原理
自动化测试 (四) 自动卸载软件
自动化测试 (五) 读写64位操作系统的注册表
转载于:https://www.cnblogs.com/MarchThree/p/3866842.html
C#_自动化测试 (四) 自动卸载软件相关推荐
- 自动化测试 (四) 自动卸载软件
在平常的测试工作中,经常要安装软件,卸载软件, 即繁琐又累. 安装和卸载完全可以做成自动化. 安装软件我们可以通过自动化框架,自动点击Next,来自动安装. 卸载软件我们可以通过msiexec命 ...
- 自动化测试 ——自动卸载软件
在平常的测试工作中,经常要安装软件,卸载软件, 即繁琐又累. 安装和卸载完全可以做成自动化. 安装软件我们可以通过自动化框架,自动点击Next,来自动安装. 卸载软件我们可以通过msiexec命令行工 ...
- geek软件是干什么的_详解强力卸载软件Geek Uninstaller使用教程
我们在很多的时候在电脑中安装的防护的软件是会对系统做一些修改的,在不想要使用哪一个软件以后卸载在电脑中还是有残留的情况的,按这个时候小伙伴们可以直接使用专业的清理卸载软件Geek Uninstalle ...
- 魅族手机自动卸载软件
魅族手机有毒啊, 魅蓝手机 下载kingRoot app卸载预装软件,竟然自动卸载了kingRoot ??! 这操作看不懂啊~ 话说这预装软件都是些什么玩意,整天给你弹些乱七八糟的东西 ; 反正我是对 ...
- C# Winform自动卸载软件
1.用msiexec 命令来卸载软件 平常我们手动卸载软件都是到控制面板中的"添加/删除"程序中去卸载软件, 或者通过程序自带的卸载软件来卸载. 我们可以通过 MsiExec.ex ...
- android程序自动卸载软件,Android应用静默安装和卸载
App的静默安装和卸载 Android系统本身提供了安装卸载功能,但是api接口是@hide的,不是公开的接口,所以在应用级别 是无法实现静默安装和卸载的,要实现静默安装和卸载需要是系统应用,要有系统 ...
- 百度贴吧发帖软件_贴吧自动发帖软件
一个百度账号几乎可以通用百度下面的所有的产品的登录,比如说贴吧.百度知道.百度云等等. 账号的资料注册非常简单,小微在这里就不详细说明.新注册的号记得养一养,尤其是贴吧账号,等级越高,享受到的权限也就 ...
- win10运行在哪里打开_Win10在哪里卸载软件程序?Win10四种正确卸载软件或者游戏的方法...
如今Win10系统已经是目前主流的操作系统,各个功能都十分完善了,可能熟悉Win7或者XP的朋友,刚刚开始使用Win10操作系统的一些朋友,连卸载软件程序都不知道怎么卸载,找不到地方.那么Win10在 ...
- ios keychain 不被清理_苹果手机卸载软件会不会有残留?带你认识iOS沙盒机制!...
iPhone能干净的卸载软件吗,会不会有残留_苹果手机怎么样完全清除软件残留个人信息? 这种问题,最容易发生在你换手机的时候,旧手机给家人使用或者是当二手机出给别人,就要使用到这种方法! 首先得了解下 ...
最新文章
- 学计算机的八字,计算机教室八字格言
- 推荐系统里,可以用蒸馏吗?
- OutOFMemoryError
- redis streams_初步了解Redis Streams以及如何在Java中使用它们
- MVP模式在Android项目中的使用
- mitmproxy https抓包的原理是什么?
- C#中的深度学习:ML.NET中具有预训练模型的硬币识别
- Gulp vs Grunt 前端工程构建工具
- L2TP 配置实例——CALL LNS
- UVA 12299 - RMQ with Shifts 线段树
- 耐思尼克域名注册:通过icann之后和之前的那些小故事
- 新手入门:手把手从PHP环境到ThinkPHP6框架下载
- 【蓝桥杯单片机组模块】15、PWM学习(总结版)
- python识别图片指定位置文字_python 识别图片中的文字信息方法
- 计算机进入pe快捷键,华硕笔记本电脑快捷键进入u盘启动教程
- 此 Google 帐号尚未与设备关联。要安装应用,请先访问设备上的 Play 商店应用。 了解详情
- Boost.Geometry中的几何要素(Primitives)
- 极海APM32F072RB开发环境测试
- ONE~~~~~~~~~
- C语言常用转义字符表 和 ASCII码表完整版
热门文章
- Codeforces 814C - An impassioned circulation of affection
- MySQL实现差集(Minus)和交集(Intersect)
- Cubieboard:享誉国外 Linux 圈子的中国产品
- 患者是否应该主动关注医疗知识
- flink-jdbc-driver和flink-sql-gateway的作用
- 误删/usr/bin/python2.7解决方案
- hbase官方网站声称的兼容是否是100%兼容?
- RuntimeError: inconsistent AsyncHTTPClient cache
- 一句话讲清楚GIL锁
- TypeError: type str doesn't define __round__ method