如何使用PowerShell批量删除注册表项

Posted TheOneGIS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用PowerShell批量删除注册表项相关的知识,希望对你有一定的参考价值。


如何使用PowerShell批量删除注册表项

问题描述

卸载了可牛压缩软件以后,发现右键菜单中仍然有可牛压缩的选项。不用想就知道是注册表中有该软件的残留。
打开注册表,进行搜索发现在​​​计算机\\HKEY_USERS\\S-1-5-21-3610452307-4043425157-186669480-1001\\Software\\Classes​​​的子目录下有超过100+的关于可牛压缩的子项。
注册表编辑器还不支持按住Shift进行多选,所以只能使用脚本进行批量删除。
!!!友情提示,删除之前请进行注册表备份,或者你百分比确定你的代码没有问题,再执行,否则发生的任何损失,本文概不负责!!!

观察和该软件相关的项目名称,发现名称中均有​​计算机\\HKEY_USERS\\S-1-5-21-3610452307-4043425157-186669480-1001\\Software\\Classes\\kzip_main.exe.*​​这样的形式。有规律就好办了,下面我们开始介绍相关知识,并进行代码批量删除。

注册表路径以及如何获得注册表子项

在PowerShell中注册表也有路径,跟我们文件和文件夹路径类似,上面的注册表项的路径可以表示为:
​​​REGISTRY::\\HKEY_USERS\\S-1-5-21-3610452307-4043425157-186669480-1001\\Software\\Classes\\​​​。
那我们如何获得该注册表路径下面的所有子项呢?使用​​​Get-ChildItem​​​命令(别名​​dir​​​或者​​l​​),代码如下:

$root = "REGISTRY::\\HKEY_USERS\\S-1-5-21-3610452307-4043425157-186669480-1001\\Software\\Classes\\"
$items = (l -Path $root)

第一行定义注册表路径,第二行得到该路径下的所有子项,结果为Array数组类型。

基于条件过滤删除项

因为我们要删除的子项名称中都包含“kzip_main.exe”这样的字符,所以我们使用​​Where-Object​​​命令(别名​​where​​​或者​​?​​)进行条件过滤,代码如下:

$items = $items | ? $_.PSPath -like "*kzip_main.exe*"

其中,​​|​​​为管道运算符,将操作符前面的结果传递到操作符后面的处理中。​​$_​​​符号代表迭代过程中的每个变量,是​​$PSItem​​​系统内置变量的别名。在这里即代表的是​​$items​​数组中的每个元素。

For循环删除子项

通过​​?​​​命令选择出来要删除的元素以后,我们可以使用​​ForEach_Object​​​命令(别名​​foreach​​​或者​​%​​)遍历该数组删除所有元素,代码如下:

$items | % rm -Force -Recurse $_.PSPath

其中,​​-Force​​​和​​-Recurse​​参数代表强制删除和迭代删除子项。

总结起来,上面的代码可以写成如下一行:

(l -Path "REGISTRY::\\HKEY_USERS\\S-1-5-21-3610452307-4043425157-186669480-1001\\Software\\Classes\\") | ? $_.PSPath -like "*kzip_main.exe*" | % rm -Force -Recurse $_.PSPath

在强调一遍,注册表删除有风险,最好进行备份再进行操作!!!PEACE OUT!


以上是关于如何使用PowerShell批量删除注册表项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PowerShell批量删除注册表项

如何使用PowerShell批量删除注册表项

如何使用PowerShell批量删除注册表项

如何获取注册表项的值,并且仅使用 powershell 获取值

如何使用 powershell 以编程方式查找用户 HKEY_USERS 注册表项?

如何通过批处理删除注册表中包含某关键词的项,值,数据!