Board logo

标题: [注册表类] 名称的更改(我的电脑更改为Computer) [打印本页]

作者: ibm    时间: 2008-9-24 12:26     标题: 名称的更改(我的电脑更改为Computer)

这个批处理文件的设计目的,是实现更改
“A我的电脑 B网上邻居 C控制面板 D打印机 E我的文档 F回收站 G拨号网络 H浏览器 I历史”
的名称和图标的提示信息,但有错误,不能正常运行,请大家帮忙改正,谢谢!
  1. SETLOCAL ENABLEDELAYEDEXPANSION
  2. :BAT2MENUM
  3. @REM 名称的更改
  4. @ECHO OFF
  5. ECHO.
  6. ::此处应改为自己系统的类型XP、Vista、2000等
  7. set SYSTEM=Vista
  8. IF /I "%SYSTEM%"=="Vista" (
  9. SET Localiz= ) ELSE ( SET Localiz=Rem )
  10. :ChB2MMTmp
  11. ECHO 名称的更改,多个更改项用空格分隔
  12. ECHO.
  13. ECHO 序  1名称   2图标提示信息
  14. ECHO A 1我的电脑 2我的电脑图标提示
  15. ECHO B 1网上邻居 2网上邻居
  16. ECHO C 1控制面板 2控制面板
  17. ECHO D 1打印机  2打印机
  18. ECHO E 1我的文档 2我的文档
  19. ECHO F 1回收站  2回收站
  20. ECHO G 1拨号网络 2拨号网络
  21. ECHO H 1浏览器  2浏览器
  22. ECHO I 1历史   2历史
  23. ECHO 例:A1-Computer A2-显示连接到此计算机的驱动器和硬件 C1-ControlPanel C2-控制面板 F1-RecycleBin F2-回收站 H1-Browser H2-浏览器
  24. ECHO.
  25. :ECHO 行号2 && ECHO %B2MMTmp% && PAUSE
  26. SET B2MMTmp=
  27. SET /P B2MMTmp=[回车]:跳过,请输入: 
  28. IF /I "%B2MMTmp%"=="" GOTO END2MENUM
  29. ::去掉全角空格
  30. SET "B2MMTmp=%B2MMTmp: = %"
  31. MKDIR BAT2MENUM
  32. for %%i in ( %B2MMTmp% ) do (
  33.   SET TE=%%i
  34.   IF "!TE:~2,1!" NEQ "-" ( GOTO ERRORB2MMTmp )
  35.   IF /I "!TE:~0,1!"=="A" (
  36.     SET TEA={20D04FE0-3AEA-1069-A2D8-08002B30309D}
  37.     reg export HKCR\CLSID\!TEA! BAT2MENUM\我的电脑.reg /Y
  38.     echo ; 我的电脑标识,可作恢复之用 >> BAT2MENUM\我的电脑.reg
  39.    )
  40.   IF /I "!TE:~0,1!"=="B" (
  41.     SET TEA={208D2C60-3AEA-1069-A2D7-08002B30309D}
  42.     reg export HKCR\CLSID\!TEA! BAT2MENUM\网上邻居.reg /Y
  43.     echo ; 网上邻居标识,可作恢复之用 >> BAT2MENUM\网上邻居.reg
  44.    )
  45.   IF /I "!TE:~0,1!"=="C" (
  46.     SET TEA={21EC2020-3AEA-1069-A2DD-08002B30309D}
  47.     reg export HKCR\CLSID\!TEA! BAT2MENUM\控制面板.reg /Y
  48.     echo ; 控制面板标识,可作恢复之用 >> BAT2MENUM\控制面板.reg
  49.    )
  50.   IF /I "!TE:~0,1!"=="D" (
  51.     SET TEA={2227A280-3AEA-1069-A2DE-08002B30309D}
  52.     reg export HKCR\CLSID\!TEA! BAT2MENUM\打印机.reg /Y
  53.     echo ; 打印机标识,可作恢复之用 >> BAT2MENUM\打印机.reg
  54.    )
  55.   IF /I "!TE:~0,1!"=="E" (
  56.     SET TEA=450D8FBA-AD25-11D0-98A8-0800361B1103}
  57.     reg export HKCR\CLSID\!TEA! BAT2MENUM\我的文档.reg /Y
  58.     echo ;我的文档标识,可作恢复之用 >> BAT2MENUM\我的文档.reg
  59.    )
  60.   IF /I "!TE:~0,1!"=="F" (
  61.     SET TEA={645FF040-5081-101B-9F08-00AA002F984E}
  62.     reg export HKCR\CLSID\!TEA! BAT2MENUM\回收站.reg /Y
  63.     echo ; 回收站标识,可作恢复之用 >> BAT2MENUM\回收站.reg
  64.    )
  65.   IF /I "!TE:~0,1!"=="G" (
  66.     SET TEA={992CFFA0-F557-101A-88EC-00DD010CCC48}
  67.     reg export HKCR\CLSID\!TEA! BAT2MENUM\拨号网络.reg /Y
  68.     echo ; 拨号网络,可作恢复之用 >> BAT2MENUM\拨号网络.reg
  69.    )
  70.   IF /I "!TE:~0,1!"=="H" (
  71.     SET TEA={BFB23B42-E3F0-101B-8488-00AA003E56F8}
  72.     reg export HKCR\CLSID\!TEA! BAT2MENUM\浏览器.reg /Y
  73.     echo ; 浏览器标识,可作恢复之用 >> BAT2MENUM\浏览器.reg
  74.    )
  75.   IF /I "!TE:~0,1!"=="I" (
  76.     SET TEA={FF393560-C2A7-11CF-BFF4-444553540000}
  77.     reg export HKCR\CLSID\!TEA! BAT2MENUM\历史.reg /Y
  78.     echo ; 历史标识,可作恢复之用 >> BAT2MENUM\历史.reg
  79.    )
  80.    IF "!TE:~1,1!" EQU "1" ( REG ADD HKCR\CLSID\!TEA! /VE /T REG_SZ /D "!TE:~3!" /F )
  81.    Rem 当是Vista系统时,Localiz的值是“::”,即不执行下面这行代码。
  82.    %Localiz% IF "!TE:~1,1!" EQU "1" ( REG ADD HKCR\CLSID\!TEA! /V LocalizedString /T REG_EXPAND_SZ /D "!TE:~3!" /F )
  83.    IF "!TE:~1,1!" EQU "2" ( REG ADD HKCR\CLSID\!TEA! /V Infotip /T REG_EXPAND_SZ /D "!TE:~3!" /F )
  84. ) && GOTO  EB2MMTmp
  85. :ERRORB2MMTmp
  86. ECHO.
  87. ECHO.
  88. COLOR 0C
  89. ECHO 错误,请重新输入:
  90. ECHO.
  91. PAUSE
  92. ECHO.
  93. COLOR 1F
  94. GOTO ChB2MMTmp
  95. :EB2MMTmp
  96. :END2MENUM
  97. ECHO.
  98. ECHO.
  99. ECHO 操作成功完成……
  100. PAUSE 1>NUL
  101. CLS
  102. exit
复制代码
==============================================================
我又作了一段简单的代码,具备上面例子的框架,也是不循环,帮我分析一下,
代码少了很多,容易找到问题:
  1. SETLOCAL ENABLEDELAYEDEXPANSION
  2. :Bat2MenuM
  3. ECHO OFF
  4. SET B2MMTmp=A1 B1 C2 D2 E1 F1 A3
  5. for %%i in ( !B2MMTmp! ) do (
  6.   SET TE=%%i
  7. ECHO 跟踪行号6 && ECHO TE=!TE!=!TE:~0,1! && PAUSE
  8.     IF /I "!TE:~0,1!"=="A" (
  9.       echo TE=!TE:~0,1!=A
  10. ECHO 跟踪行号7 && ECHO TE=!TE!=!TE:~0,1! && PAUSE
  11.                             ) else (
  12.     IF /I "!TE:~0,1!"=="B" (
  13.       echo TE=!TE:~0,1!=B
  14. ECHO 跟踪行号8 && ECHO TE=!TE!=!TE:~0,1! && PAUSE
  15.                             ) else ( GOTO ERRORB2MMTmp ) )
  16. ECHO 跟踪行号15 && ECHO TE=!TE!=!TE:~0,1! && PAUSE
  17. IF "!TE:~1,1!" EQU "1" (
  18.   echo AA              ) else (
  19. IF "!TE:~1,1!" EQU "2" (
  20.   echo BB               )
  21.       GOTO ERRORB2MMTmp)
  22. ECHO 跟踪行号16 && ECHO 循环变量值=%%i && PAUSE
  23. ) && GOTO  EB2MMTmp
  24. :ERRORB2MMTmp
  25. COLOR 0C
  26. ECHO 错误,请重新输入:
  27. ECHO.
  28. PAUSE
  29. ECHO.
  30. GOTO ChB2MMTmp
  31. :EB2MMTmp
  32. ECHO.
  33. ECHO.
  34. ECHO 操作成功完成……
  35. PAUSE 1>NUL
复制代码


%%i的取值,得到A1后就会退出,为什么不循环取B1?

[ 本帖最后由 ibm 于 2008-9-25 17:47 编辑 ]
作者: Batcher    时间: 2008-9-24 13:24

有啥样的错误?
作者: ibm    时间: 2008-9-24 13:48

For循环不正常
作者: zqz0012005    时间: 2008-9-24 22:26

复合语句内部的注释应该用rem而不能用::

Label的标记冒号:会导致for语句中断,从而缺少语句结束的反括号),出现语法错误

=============================================================================================
以上为错误言论!
=============================================================================================

应该是:
for语句内部使用goto跳转会导致for循环中断,立即退出循环。
与for语句内部有无Label标签无关。for内部可以使用::作注释

[ 本帖最后由 zqz0012005 于 2008-10-7 19:18 编辑 ]
作者: gfwlxx    时间: 2008-9-25 00:26

挺有意思          呵呵
作者: pusofalse    时间: 2008-9-25 02:54

看下这里面:HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache
我的电脑、回收站、网上邻居等系统文件夹的名称都在这里存储着。
作者: ibm    时间: 2008-9-25 17:14     标题: 回复 4楼 的帖子

谢谢版主的回复!

原来是Label的标记的问题,有什么解决办法吗?

我去掉了Label的标记,但为什么还是不行?
我修改了帐子,其中第一段代码太长,不好读,第二段简单了许多,问题依旧,循环变量取第一次值后就退出循环体了,这是为什么?

[ 本帖最后由 ibm 于 2008-9-25 17:50 编辑 ]
作者: ibm    时间: 2008-9-25 17:29     标题: 回复 6楼 的帖子

我的系统是Vista,没有MUICache项
作者: Batcher    时间: 2008-9-25 19:42     标题: 回复 8楼 的帖子

建议在顶楼把自己的系统环境一次性描述清楚
作者: zqz0012005    时间: 2008-9-25 20:10

你这个写法太烂了,注意规范

没兴趣看完,分析起来好吃力,貌似楼主把简单问题复杂化了

不如我自己写一个
作者: ibm    时间: 2008-9-26 19:53     标题: 回复 10楼 的帖子

接受版主的批评,恳请版主能帮我重写一个。

目的:实现名称和图标提示内容的更改:
我的电脑 网上邻居 控制面板 打印机 我的文档 回收站 拨号网络 浏览器 历史

例如:在Vista下,桌面里“计算机”图标改名为“Computer ”,
鼠标放在该图标上的提示:“显示连接到此计算机的驱动器和硬件”,更改为“我的电脑”,
图标的名字和提示要求用键盘输入,
用户可以修改也可不修改这些信息,
可以只修改图标的名字不修改图标的提示,反之也可以,
还要有推荐值,下面即是推荐值:
      名称       图标提示
我的电脑 Computer   Computer我的电脑
网上邻居 Network    Network网上邻居
控制面板 ControlPanel  ControlPanel控制面板
打印机  Printer     Printer打印机
我的文档 MyDocuments MyDocuments我的文档
回收站  RecycleBin   RecycleBin回收站
拨号网络 DiallingTone  DiallingTone拨号网络
浏览器  Browser    Browser浏览器
历史   Recent     Recent历史

因为这只是一组代码中的一部分,所以要求多了点,
退请版主的帮助,非常感谢!

[ 本帖最后由 ibm 于 2008-9-26 20:27 编辑 ]
作者: zqz0012005    时间: 2008-9-27 01:29

调整了代码结构,使用函数形式。并给了一个修改示例(modifyA)
  1. @ECHO OFF
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. :BAT2MENUM
  4. ECHO.
  5. rem 此处应改为自己系统的类型XP、Vista、2000等
  6. set SYSTEM=Vista
  7. IF /I "%SYSTEM%"=="Vista" (
  8. SET "Localiz="
  9. ) ELSE (
  10. SET Localiz=Rem
  11. )
  12. :ChB2MMTmp
  13. ECHO 代号 代表对象  1推荐名称     2推荐图标提示信息
  14. ECHO.
  15. ECHO A    我的电脑 Computer       Computer我的电脑
  16. ECHO B    网上邻居 Network    Network网上邻居
  17. ECHO C    控制面板 ControlPanel   ControlPanel控制面板
  18. ECHO D    打印机  Printer        Printer打印机
  19. ECHO E    我的文档 MyDocuments    MyDocuments我的文档
  20. ECHO F    回收站  RecycleBin     RecycleBin回收站
  21. ECHO G    拨号网络 DiallingTone   DiallingTone拨号网络
  22. ECHO H    浏览器  Browser        Browser浏览器
  23. ECHO I    历史   Recent         Recent历史
  24. ECHO.
  25. ECHO 输入格式:代号功能号-新名称或提示信息,多个更改项用空格分隔
  26. ECHO 功能号:1为修改名称,2为修改图标提示信息
  27. ECHO 例:A1-Computer A2-显示连接到此计算机的驱动器和硬件 C1-ControlPanel D2-
  28. ECHO.可以不输入新名称或提示信息,则修改为推荐的新名称或提示信息
  29. SET /P B2MMTmp=请输入(请不要在新名称或提示信息中加空格):
  30. rem 去掉全角空格
  31. SET "B2MMTmp=%B2MMTmp: = %"
  32. for %%i in (%B2MMTmp%) do (
  33.     (echo %%i|findstr /i "^[a-z][1-2]-" >nul) && (call :modify "%%i") || (echo "%%i"输入不正确,稍后请重新输入!& echo.)
  34. )
  35. goto :eof
  36. :modify
  37. set "te=%~1"
  38. for %%a in (A B C D E F G H I) do (
  39.     if /i "!TE:~0,1!"=="%%a" (
  40.         call :modify%%a %1
  41.         goto :eof
  42.     )
  43. )
  44. goto :eof
  45. :modifyA
  46.     SET "TEA=HKCR\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}"
  47.     reg export !TEA! 我的电脑_bak.reg
  48.     echo ; 我的电脑标识>>我的电脑_bak.reg
  49.     IF "!TE:~1,1!" EQU "1" (
  50.         if "!TE:~3!"=="" (REG ADD !TEA! /VE /D "Computer" /F) else (REG ADD !TEA! /VE /D "!TE:~3!" /F)
  51.     ) ELSE (
  52.         if "!TE:~3!"=="" (REG ADD !TEA! /V Infotip /T REG_EXPAND_SZ /D "Computer我的电脑" /F) else (REG ADD !TEA! /V Infotip /T REG_EXPAND_SZ /D "!TE:~3!" /F)
  53.     )
  54. goto :eof
  55. :modifyB
  56.     SET TEA={208D2C60-3AEA-1069-A2D7-08002B30309D}
  57.     reg export HKCR\CLSID\!TEA! 网上邻居.reg
  58.     echo ; 网上邻居标识>>网上邻居.reg
  59. goto :eof
  60. :modifyC
  61.     SET TEA={21EC2020-3AEA-1069-A2DD-08002B30309D}
  62.     reg export HKCR\CLSID\!TEA! 控制面板.reg
  63.     echo ; 控制面板标识>>控制面板.reg
  64. goto :eof
  65. :modifyD
  66.     SET TEA={2227A280-3AEA-1069-A2DE-08002B30309D}
  67.     reg export HKCR\CLSID\!TEA! 打印机.reg
  68.     echo ; 打印机标识>>打印机.reg
  69. goto :eof
  70. :modifyE
  71.     SET TEA=450D8FBA-AD25-11D0-98A8-0800361B1103}
  72.     reg export HKCR\CLSID\!TEA! 我的文档.reg
  73.     echo ;我的文档标识>>我的文档.reg
  74. goto :eof
  75. :modifyF
  76.     SET TEA={645FF040-5081-101B-9F08-00AA002F984E}
  77.     reg export HKCR\CLSID\!TEA! 回收站.reg
  78.     echo ; 回收站标识>>回收站.reg
  79. goto :eof
  80. :modifyG
  81.     SET TEA={992CFFA0-F557-101A-88EC-00DD010CCC48}
  82.     reg export HKCR\CLSID\!TEA! 拨号网络.reg
  83.     echo ; 拨号网络>>拨号网络.reg
  84. goto :eof
  85. :modifyH
  86.     SET TEA={BFB23B42-E3F0-101B-8488-00AA003E56F8}
  87.     reg export HKCR\CLSID\!TEA! 浏览器.reg
  88.     echo ; 浏览器标识>>浏览器.reg
  89. goto :eof
  90. :modifyI
  91.     SET TEA={FF393560-C2A7-11CF-BFF4-444553540000}
  92.     reg export HKCR\CLSID\!TEA! 历史.reg
  93.     echo ; 历史标识>>历史.reg
  94.     IF "!TE:~1,1!" EQU "1" (
  95.         REG ADD HKCR\CLSID\!TEA! /VE /T REG_SZ /D "!TE:~3!" /F
  96.         Rem 当是Vista系统时,Localiz的值是“::”,即不执行下面这行代码。
  97.         %Localiz% REG ADD HKCR\CLSID\!TEA! /V LocalizedString /T REG_EXPAND_SZ /D "!TE:~3!" /F
  98.     ) ELSE (
  99.         REG ADD HKCR\CLSID\!TEA! /V Infotip /T REG_EXPAND_SZ /D "!TE:~3!" /F
  100.     )
  101. goto :eof
复制代码

作者: ibm    时间: 2008-9-27 21:31     标题: 回复 12楼 的帖子

对版主的帮助感激不尽,虽然和我的要求还不太相同,但我稍加修改就可以了,
谢谢版主,版主真是大好人!
作者: zqz0012005    时间: 2008-9-27 23:11

其实如果程序限制用户每次只能修改一项,可以提高工作效率:不需要for循环,不需要if判断首字母。大致结构如下:
  1. :main
  2. ...
  3. :input
  4. set B2MMTmp=
  5. SET /P B2MMTmp=请输入(直接回车返回主菜单):
  6. if not defined B2MMTmp (goto main) else SET "B2MMTmp=%B2MMTmp: = %"
  7. (echo %B2MMTmp%|findstr /i "^[a-z][1-2]-" >nul) && (goto modify%B2MMTmp:~,1%) || (echo 输入不正确,请重新输入!& goto input)
  8. :modifyA
  9.     ...
  10. goto input
  11. :modifyB
  12.     ...
  13. goto input
  14. ...
复制代码

作者: ibm    时间: 2008-10-2 19:26     标题: 回复 14楼 的帖子

谢谢版主,
我需要的这段代码,只是一组代码中的一小段,
可以由用户分段执行,也可以自动执行全部代码,
当分段执行时可以不循环,每次修改一项,
但当自动执行全部代码时,就会停在这里一项项的输入,不是我设计的初衷。
12楼的代码,我稍加修改,加入一个推荐值,完全满足我的要求了。

惟一的缺点是
echo ; 我的电脑标识>>我的电脑_bak.reg
这段代码补充进《我的电脑_bak.reg》里面,会在最后一行显示乱码,
虽然问题解决了:
type bak.reg > bak.txt
del /q bak.ret
echo ......>>bak.txt
ren bak.txt bak.reg
但好像太麻烦了,还没找到更好的解决办法。


再次感谢版主的帮助!

[ 本帖最后由 ibm 于 2008-10-2 19:43 编辑 ]




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