Board logo

标题: [注册表类] [已解决]批处理保留和删除随机的注册表值(无效的MUI缓存) [打印本页]

作者: jjmmrr    时间: 2010-12-5 00:40     标题: [已解决]批处理保留和删除随机的注册表值(无效的MUI缓存)

由于不想用软件来清理注册表,想搞个批处理删除无效的MUI缓存。


保留以@开头的值:
HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache\@

删除以C、D、E、F、G开头的值:
HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache\C:\
HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache\D:\
HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache\E:\
HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache\G:\

下面是小弟自己构思,但是不懂得写搜索c d e f代码。请高手指点,谢谢。
Set MUICache=HKCU\Software\Microsoft\Windows\ShellNoRoam\MUICache
Set ccc=c:\*
reg delete "%MUICache%" %ccc% /f>nul

[ 本帖最后由 jjmmrr 于 2010-12-5 13:54 编辑 ]
作者: hanyeguxing    时间: 2010-12-5 00:59

说明,以下所有代码中:"skip=4 delims=        "的delims=后为一个tab制表符,不是空格!~
只删除非@开头的
  1. @echo off&setlocal enabledelayedexpansion
  2. set r=HKCU\Software\Microsoft\Windows\ShellNoRoam\MUICache
  3. for /f "skip=4 delims=        " %%a in ('reg query %r%') do (
  4.     set a=%%a
  5.     if not "!a:~0,5!"=="    @" reg delete %r% /v "!a:~4!" /f
  6. )
复制代码
只删除c、d、e、f、g开头的
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (c d e f g) do set ""#    %%a"=="
  3. set r=HKCU\Software\Microsoft\Windows\ShellNoRoam\MUICache
  4. for /f "skip=4 delims=        " %%a in ('reg query %r%') do (
  5.     set a=%%a
  6.     if defined "#!a:~0,5!" reg delete %r% /v "!a:~4!" /f
  7. )
复制代码


对于以上两个代码,可以附加删除条件:键名所指向的文件不存在才删除。将代码
  1. if not exist "!a:~4!"
复制代码
插入到 reg delete 之前即可。

[ 本帖最后由 hanyeguxing 于 2010-12-5 07:32 编辑 ]
作者: shenlong2006    时间: 2010-12-5 10:01     标题: 看看,来学习一下!!!

看看,来学习一下!!!
作者: jjmmrr    时间: 2010-12-5 12:40

delims=后为一个tab制表符,我也按兄弟说的修改了。

1.只删除c、d、e、f、g开头,批处理执行完,会缓存在(MUICache)注册里(是当前Bat的文件名)。
  说明:只删除非@开头的,却不会缓存在(MUICache)注册里。

删除c、d、e、f、g开头,比较不会误删除。可是有缺陷,如文中所说的。

2.只删除非@开头,却不能删除文件名和路径包含有特殊字符(!字符)。
  例如:D:\!Program Files\!Tencent\QQ\Bin\QQ.exe

3.对于以上两个代码,可以附加删除条件:键名所指向的文件不存在才删除。将代码

  是文件不存在才删除,还是存在才删除。不知道是我理解有误。还是兄弟多写个汉字。

如果代码能精简些更好。
例如:只要加个搜索 c:\ d:\ e:\ f:\ 开头(*代表后面的路径和文件夹)
Set MUICache=HKCU\Software\Microsoft\Windows\ShellNoRoam\MUICache
Set ccc=c:\*
reg delete "%MUICache%" %ccc% /f>nul

希望 寒夜孤星 兄弟能把代码注解,小弟研究学习一下,我想把代码应用在其它地方。

                      再次感谢。
作者: hanyeguxing    时间: 2010-12-5 12:56

1,所有批处理如果没做说明,则都不考虑敏感字符的的问题,例如包含英文叹号、英文%、英文&等等。如果文本没有做说明,则都指ANSI编码。
2,无效的MUICache的定义是什么?只要定位的文件不存在了,他的MUICache就没有意义了。
  1. @echo off
  2. for %%a in (c d e f g) do set ""#    %%a"=="
  3. set r=HKCU\Software\Microsoft\Windows\ShellNoRoam\MUICache
  4. for /f "skip=4 delims=        " %%a in ('reg query %r%') do (
  5.     set a=%%a
  6.     setlocal enabledelayedexpansion
  7.     if defined "#!a:~0,5!" reg delete %r% /v "!a:~4!" /f
  8.     Endlocal
  9. )
复制代码

[ 本帖最后由 hanyeguxing 于 2010-12-5 13:05 编辑 ]
作者: jjmmrr    时间: 2010-12-5 13:35

回复:
所有批处理如果没做说明,则都不考虑敏感字符的的问题,例如包含英文叹号、英文%、英文&等等。如果文本没有做说明,则都指ANSI编码。

我今天测试你4号给的代码才知道不能删除字符。以后会多注意的。

刚刚会测试你的代码。已经达到我想要的效果。

只加了二行代码就能删除字符。我还以为要加什么代码。

setlocal enabledelayedexpansion
Endlocal
                                                 十分感谢你 寒夜孤星 兄弟。你花了点时间写代码。
我搜索一下你的帖。意思应该是


1,在for内部使用本地化开关,是为了减少被定义的本地化变量。本地化的变量限制:所有变量的最大环境变量的总和大小(包括变量名和等号)为 65,536 KB。
2,因为最大setlocal递归层为32级。如果在for内部开启了本地化,而不使用 Endlocal ,那么从第33个文件开始将出错。
3,setlocal enabledelayedexpansion的作用:开始本地化变量;开启变量延迟
4,在批处理文件的结尾处有一个隐含的 endlocal 命令。
5,楼主示例中的特例:子命令中的第一个for用来定义变量,第二个for用来解析被定义的这些变量。如果不每次结束该本地化,则每次操作都受以前定义的影响。即第二个for解析时,set _无法区分这些_开头的变量名哪些是本此定义的,哪些是以前定义的。





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