Board logo

标题: [系统增强] 批处理删除右键"新建"菜单中的多余项目[20080317] [打印本页]

作者: namejm    时间: 2007-11-17 21:25     标题: 批处理删除右键"新建"菜单中的多余项目[20080317]

  最近在测试软件,很多软件都喜欢在右键"新建"菜单下添加自己的专用文件格式选项,一圈测试下来,"新建"菜单里臃肿不堪,严重影响了右键的打开速度。
  网上搜索能删除"新建"项目的软件,发现ShowNew不能删除 MS Office 系列的"新建"项目,并且不支持批量删除;ContextEdit 里转了半天,找不到删除的方法——并不是找不到删除选项,而是跑出来的项目太多,居然不提供搜索功能,想删除指定项目还得在成百上千个记录中寻找、定位,太不人性化了。
  翻了一下以前写过的批处理,发现了一个好东西,于是,略做修改,发出来让大家用用。板砖之类的请尽管飞过来~~~

  版本一:把注册表信息放到与批处理同目录的RegBackup文件夹下
  1. @echo off
  2. ::   一般情况下,右键"新建"菜单项目对应于注册表"HKEY_CLASSERS_ROORT\.后缀名"
  3. :: 项目下的"ShellNew"键。如果常规模式下删除不了,则把"HKEY_CLASSERS_ROORT\.后缀名"
  4. :: 删除掉即可(注意,可能会有后遗症)。
  5. ::    Code by namejm Modified on 2007.9.29~2008.3.17 CMD@XP
  6. mode con lines=25
  7. color 1f
  8. :Main
  9. cls
  10. title "新建"菜单项目删除器-删除模式
  11. echo.&echo.&echo.
  12. echo            本程序能删除右键菜单中"新建"项目下的多余内容,为"新建"菜单减肥!
  13. echo.
  14. echo            如果想让某种类型的文件不再出现在鼠标右键的"新建"菜单中,请直接
  15. echo.
  16. echo        输入该文件类型的后缀名。例如:rar。默认使用常规删除模式。
  17. echo.
  18. echo            如果常规删除不起作用,请使用强行删除模式,比如在对付 MS Office
  19. echo.
  20. echo        系列软件在"新建"菜单中的项目的时候。不过,此方式可能会产生后遗症。
  21. echo.
  22. echo            注意:需要点开"新建"菜单两次才能看到删除后的变化!
  23. echo.&echo.
  24. echo    退出请选 0  使用强行删除模式请在最前面添加 1  恢复菜单项目请按 2
  25. echo.&echo.
  26. echo               请输入后缀名(多个后缀名用空格分开):
  27. echo.
  28. set input=
  29. set /p input=                  
  30. if not defined input goto Main
  31. set "input=%input:"=%"
  32. if "%input%"=="0" exit
  33. set ShellNew=ShellNew
  34. if "%input:~0,1%"=="1" (
  35.     set ShellNew=
  36.     set "input=%input:~1%"
  37. )
  38. if "%input%"=="2" goto Repair
  39. md RegBackup 2>nul
  40. for %%i in (%input%) do (
  41.     reg export HKCR\.%%i\%ShellNew% RegBackup\_%%i.reg>nul 2>nul
  42.     if exist RegBackup\_%%i.reg (
  43.         more RegBackup\_%%i.reg>RegBackup\%%i.reg
  44.         echo ; 这是鼠标右键"新建"菜单项目 .%%i 类型的注册表信息,可作恢复之用>>RegBackup\%%i.reg
  45.         del /a /f RegBackup\_%%i.reg>nul 2>nul
  46.         reg delete HKCR\.%%i\%ShellNew% /f >nul 2>nul
  47.     ) else (echo.&echo                %%i 类型没有可供删除的"新建"项目)
  48. )
  49. rd RegBackup 2>nul
  50. echo.&set /p=                  按任意键返回...
  51. goto Main
  52. :Repair
  53. cls
  54. title "新建"菜单项目删除器-恢复模式
  55. echo.&echo.&echo.
  56. echo              本模块只能恢复由本程序删除的右键"新建"菜单项目!
  57. echo.
  58. echo              如果想让某种类型的文件重新出现在鼠标右键的"新建"
  59. echo.
  60. echo          菜单中,请直接输入该文件类型的后缀名。例如:rar。
  61. echo.
  62. echo              注意:需要点开"新建"菜单两次才能看到恢复后的变化!
  63. echo.&echo.
  64. echo                    退出请选 0  返回删除界面请按 1
  65. echo.&echo.
  66. echo                  请输入后缀名(多个后缀名用空格分开):
  67. echo.
  68. set input=
  69. set /p input=                   
  70. if not defined input goto Repair
  71. set "input=%input:"=%"
  72. if "%input%"=="0" exit
  73. if "%input%"=="1" goto Main
  74. if not exist RegBackup (
  75.   echo.&echo              没有可恢复的项目,恢复失败!按任意键返回...
  76.     pause>nul&goto Main
  77. )   
  78. for %%i in (%input%) do (
  79.   reg import RegBackup\%%i.reg>nul 2>nul||(
  80.         echo.&echo                  .%%i 类型恢复失败
  81.     )
  82. )
  83. echo.&set /p=                  按任意键返回...
  84. goto Repair
复制代码
  版本二:把注册表信息写回注册表,不再保存在当前目录下
  1. @echo off
  2. ::   一般情况下,右键"新建"菜单项目对应于注册表"HKEY_CLASSERS_ROORT\.后缀名"
  3. :: 项目下的"ShellNew"键。如果常规模式下删除不了,则把"HKEY_CLASSERS_ROORT\.后缀名"
  4. :: 删除掉即可(注意,可能会有后遗症)。
  5. ::    Code by namejm Modified on 2007.9.29~2008.3.17 CMD@XP
  6. mode con lines=25
  7. color 1f
  8. :Main
  9. cls
  10. title "新建"菜单项目删除器-删除模式
  11. echo.&echo.&echo.
  12. echo            本程序能删除右键菜单中"新建"项目下的多余内容,为"新建"菜单减肥!
  13. echo.
  14. echo            如果想让某种类型的文件不再出现在鼠标右键的"新建"菜单中,请直接
  15. echo.
  16. echo        输入该文件类型的后缀名。例如:rar。默认使用常规删除模式。
  17. echo.
  18. echo            如果常规删除不起作用,请使用强行删除模式,比如在对付 MS Office
  19. echo.
  20. echo        系列软件在"新建"菜单中的项目的时候。不过,此方式可能会产生后遗症。
  21. echo.
  22. echo            注意:需要点开"新建"菜单两次才能看到删除后的变化!
  23. echo.&echo.
  24. echo    退出请选 0  使用强行删除模式请在最前面添加 1  恢复菜单项目请按 2
  25. echo.&echo.
  26. echo               请输入后缀名(多个后缀名用空格分开):
  27. echo.
  28. set input=
  29. set /p input=                  
  30. if not defined input goto Main
  31. set "input=%input:"=%"
  32. if "%input%"=="0" exit
  33. set ShellNew=ShellNew
  34. if "%input:~0,1%"=="1" (
  35.     set ShellNew=
  36.     set "input=%input:~1%"
  37. )
  38. if "%input%"=="2" goto Repair
  39. for %%i in (%input%) do (
  40.     reg query HKCR\.%%i\%ShellNew%>nul 2>nul && (
  41.         reg copy HKCR\.%%i\%ShellNew% HKCR\-.%%i\%ShellNew% /f /s >nul 2>nul
  42.         reg delete HKCR\.%%i\%ShellNew% /f >nul 2>nul
  43.     ) || (echo.&echo                %%i 类型没有可供删除的"新建"项目)
  44. )
  45. echo.&set /p=                  按任意键返回...
  46. goto Main
  47. :Repair
  48. cls
  49. title "新建"菜单项目删除器-恢复模式
  50. echo.&echo.&echo.
  51. echo              本模块只能恢复由本程序删除的右键"新建"菜单项目!
  52. echo.
  53. echo              如果想让某种类型的文件重新出现在鼠标右键的"新建"
  54. echo.
  55. echo          菜单中,请直接输入该文件类型的后缀名。例如:rar。
  56. echo.
  57. echo              注意:需要点开"新建"菜单两次才能看到恢复后的变化!
  58. echo.&echo.
  59. echo                    退出请选 0  返回删除界面请按 1
  60. echo.&echo.
  61. echo                  请输入后缀名(多个后缀名用空格分开):
  62. echo.
  63. set input=
  64. set /p input=                   
  65. if not defined input goto Repair
  66. set "input=%input:"=%"
  67. if "%input%"=="0" exit
  68. if "%input%"=="1" goto Main   
  69. for %%i in (%input%) do (
  70.   reg query HKCR\-.%%i\>nul 2>nul && (
  71.         reg copy HKCR\-.%%i HKCR\.%%i /f /s >nul 2>nul
  72.         reg delete HKCR\-.%%i /f>nul 2>nul
  73.     ) || (
  74.         echo.&echo                   没有可供恢复的 .%%i 类型注册表信息
  75.     )
  76. )
  77. echo.&set /p=                  按任意键返回...
  78. goto Repair
复制代码
  更新历史:

2008.3.17 修正了一处错误,使得强制删除 MS Office 系列的新建项目不再出错;
2008.3.9 增添了一个新版本,新版本代码不再把注册表信息保存在当前目录下,而是写回注册表中;
2008.3.8 增添了恢复"新建"菜单中指定项目的功能,并精简了代码;
2007.11.17 发布初始版本
作者: 110cjy    时间: 2008-1-13 16:45

谢谢楼主!!!
作者: wajxsznl    时间: 2008-2-24 20:27     标题: 有没有恢复右键菜单的?

我想要一个,要是有的话,发一下,可不可以。。。静候。。。。
作者: namejm    时间: 2008-3-8 14:26

  代码已经更新,只要是由这个脚本删除的"新建"菜单项目,都可以恢复了。若有什么建议,请多提意见。
作者: knightak    时间: 2008-4-7 17:06

超级兔子可以删除鼠标新建
作者: huajinghua    时间: 2008-4-8 23:36

呵呵,不错,但是我觉得,完全可以通过注册表查询右键新建,并列出来,显示ID,然后让用户自己选择右键新建中要删除的ID,我想要实现并不难
作者: wanxibing    时间: 2008-12-1 13:56     标题: 好是好,能否一次性多添加多个扩展名呢

如果一次能添加多个扩展名就更好 ,希望改进
作者: namejm    时间: 2008-12-1 16:54

原帖由 wanxibing 于 2008-12-1 13:56 发表
如果一次能添加多个扩展名就更好 ,希望改进

  这个功能已经有了,请看提示信息:
请输入后缀名(多个后缀名用空格分开):

作者: namejm    时间: 2008-12-1 17:00

原帖由 huajinghua 于 2008-4-8 23:36 发表
呵呵,不错,但是我觉得,完全可以通过注册表查询右键新建,并列出来,显示ID,然后让用户自己选择右键新建中要删除的ID,我想要实现并不难

  当初我写这个代码的时候,用的是XP_SP2系统,这个系统下的reg.exe有个bug:当注册表路径中含有中文的时候,会导致输出的路径信息不全,具体现象请看此帖:reg requery查询注册表时中文路径会"吃掉"最后的字符?http://www.cn-dos.net/forum/viewthread.php?tid=22202。好在XP已经出了SP3的补丁,reg.exe已经不存在这个bug,所以,你这个要求在SP3系统下会得以实现,但是,在SP2系统下是非常困难的,这也是我迟迟没有提供这个功能的原因,等时间充裕了再修改一下代码。
作者: Batcher    时间: 2008-12-1 19:48

如果要兼容sp2的话,可以在bat中调用vbs来读注册表,可能namejm兄不喜欢这种方式吧,呵呵。




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