Board logo

标题: [注册表类] [已解决]批处理如何删除注册表中指定主键下没有值和数据的子项 [打印本页]

作者: qxlovexcx    时间: 2016-11-28 09:20     标题: [已解决]批处理如何删除注册表中指定主键下没有值和数据的子项

本帖最后由 qxlovexcx 于 2016-11-29 09:58 编辑

批处理搜索出子项下没有任何数据的就返回删除主项,有数据的跳过

下面的注册表为用过的历史文件扩展名有些已经失效,失效的项下和子项都没有数据,没有失效的,多多少少会有点数据,我想用批处理搜索出子项下没有任何数据的就返回删除主项,有数据的跳过

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts]

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.]

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.\OpenWithList]

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.1sdb]

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.1sdb\OpenWithList]

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.3fr]

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.3fr\OpenWithList]

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.3fr\OpenWithProgids]
"2345Pic.3fr"=hex(0):

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.3fr\UserChoice]
"Hash"="hzTm7/WKXh8="
"ProgId"="2345Pic.3fr"

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.3g2]

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.3g2\OpenWithList]

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.3g2\OpenWithProgids]
"WMP11.AssocFile.3G2"=hex(0):

请帮个忙谢谢了
作者: CommandBatCmd    时间: 2016-11-28 14:57

回复 1# qxlovexcx


    用系统自带的注册表命令行工具reg,在for /f 中循环
查询“REG QUERY”,如果无值,就删除“REG DELETE”;
这个你应该一下子就可以搞定!
作者: qxlovexcx    时间: 2016-11-28 16:01

就是不知道怎么去搜索代表无值的问题
作者: qxlovexcx    时间: 2016-11-28 16:02

回复 2# CommandBatCmd


   不知道怎么判断有值和没值,在返回删除主项
作者: CommandBatCmd    时间: 2016-11-28 16:42

回复 4# qxlovexcx
  1. REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.扩展名\OpenWithList" /v "MRUList" >nul 2>nul
  2. REG QUERY "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.扩展名\OpenWithProgids" /s >nul 2>nul
复制代码
查询以上两条注册表信息,如果两个【同时】返回错误代码“%errorlevel%”都不为0,则删除:
  1. REG DELETE "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.扩展名" /f
复制代码
如果其中有一条返回成功代码,都不要删除。
操作前先备份注册表!
作者: flyinnet9    时间: 2016-11-28 16:48

试试看,没问题的话用你想要的命令替换掉echo部分
  1. @echo off
  2. for /f "delims=" %%a in ('reg query HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts') do (
  3.   reg query %%a /s |findstr "REG" >nul &&echo.%%a有键值>>result.txt||echo.%%a没键值>>result.txt
  4. )
复制代码

作者: pcl_test    时间: 2016-11-28 18:35

回复 3# qxlovexcx

代码只是用来实现思路的工具,自己首先要观察输出中的异同、总结规律,找到有值和无值的区别所在
http://www.bathome.net/viewthread.php?tid=14001
http://www.bathome.net/thread-2189-1-1.html
http://bbs.bathome.net/thread-31727-1-1.html
http://www.bathome.net/thread-5814-1-1.html
http://www.bathome.net/viewthread.php?tid=2530
http://www.bathome.net/viewthread.php?tid=14682
http://www.bathome.net/thread-75-1-1.html
作者: WHY    时间: 2016-11-28 23:06

这个用 PowerShell 可能比较合适,与删除文件系统空目录相同,需要考虑从内向外倒序删除
  1. $key = Get-ChildItem -Recurse 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts';
  2. For ($i=$key.Length-1; $i -ge 0; $i--) {
  3.     if($key[$i].ValueCount -eq 0 -and $key[$i].SubkeyCount -eq 0){ Remove-Item $key[$i].PSPath -Recurse }
  4. }
复制代码

作者: qxlovexcx    时间: 2016-11-29 08:55

早上到公司打开网址就看到大家的帮忙非常感谢!

版主说的也没错,其实我都明白

11年后我就没有再动过一次批处理,之后一直在玩游戏,现在已经是基本全忘记了,就只有思路了,要实现时

动手写一个代码,经常都是把全部要用到的命令的帮助文件全打开看,知道怎么回事就是那点细节搞不定,现在基本都是用以前我收藏的例题复制黏贴在根据需要修改,这样简单点,

要不有时一个命令的名称都会打错字符,搞了我几次到最后才发现打错了字符哈哈,

让各位见笑了,我应该是比小白还小白吧,年纪又大了点反应慢半拍,以前基本都不注册论坛账号也不问问题的,都是自己解决。现在真没那个耐心了,就求求大家了,谢谢了

搞定这个,我的工作就做完一大半了,后面的基本就重我以前做的xp里的移植过来可以了,到时发上来让大家指导下
最后谢谢大家的帮忙,我来式式,昨天我用
1、导出注册表
2、搜索文件
    存在和不存在的方法没搞定
作者: qxlovexcx    时间: 2016-11-29 09:34

回复 5# CommandBatCmd


    谢谢你的帮助。用了下面的代码更简单
作者: qxlovexcx    时间: 2016-11-29 09:37

回复 6# flyinnet9


    谢谢,代码简洁有效果,正是我追求的。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2