找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 26686|回复: 7

[注册表类] [已解决]求高手能帮完善程序,实现批处理查询替换注册表键值

[复制链接]
发表于 2015-3-11 16:45:59 | 显示全部楼层 |阅读模式
本帖最后由 mengqy 于 2015-3-12 09:53 编辑

公司系统是Xp,Sp2和Sp3,使用老式Outlook Express。
现在需要批量统一更换OE的smtp服务器和pop服务器。
经查询,OE的配置保存在注册表里,每个OE帐号对应一个路径。假如一台电脑有4个账户,则配置文件分别保存在以下路径:
HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000001
HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000002
HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000003
HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000004
……
每个路径下有多个键,但是只需要修改其中的“Pop Server”键和“SMTP Server”键。

请求高手帮忙,实现批量查询和修改功能。

我自己写了两个:
第一个,BUG是第一个00000001可以判断是否相同,但是00000002就不行了。无论00000002是否相同,都进行替换。
(设置的是,如果相同,则替换,如果不同,则忽略)以下是程序:
  1. @echo off
  2. :begin
  3. cls
  4. Set "regpath1=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000001"
  5. Set "regpath2=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000002"
  6. Set "regpath3=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000003"
  7. Set "regpath4=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000004"
  8. Set "regpath5=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000005"
  9. Set "findstr1=POP3 Server"
  10. Set "findstr2=SMTP Server"
  11. Set "popold=mail.imoke.org"
  12. Set "popnew=pop.imoke.org"
  13. Set "smtpold=mail.imoke.org"
  14. Set "smtpnew=smtp.imoke.org"
  15. reg query "%regpath1%" /v "%findstr1%" | findstr /i "%findstr1%"
  16. reg query "%regpath1%" /v "%findstr2%" | findstr /i "%findstr2%"
  17. reg query "%regpath2%" /v "%findstr1%" | findstr /i "%findstr1%"
  18. reg query "%regpath2%" /v "%findstr2%" | findstr /i "%findstr2%"

  19. :search1
  20. echo 搜索1
  21. for /f "tokens=1* delims=_" %%1 in ('reg query "%regpath1%" /v "%findstr1%" ^| findstr /i "%findstr1%"') do for /f "tokens=1*" %%3 in ("%%~2")do Set "a=%%4"
  22. echo %a%
  23. if "%a%"=="%popold%" (
  24. Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000001"
  25. goto do
  26. else (goto search2)
  27. )

  28. :search2
  29. echo 搜索2
  30. for /f "tokens=1* delims=_" %%1 in ('reg query "%regpath2%" /v "%findstr1%" ^| findstr /i "%findstr1%"') do for /f "tokens=1*" %%3 in ("%%~2")do Set "a=%%4"
  31. echo %a%
  32. if "%a%"=="%popold%" (
  33. Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000002"
  34. goto do
  35. else (goto search1)
  36. )

  37. ::替换过程
  38. :do
  39. echo %regpath%
  40. pause
  41. echo.
  42. echo 执行修改
  43. reg add "%regpath%" /v "%findstr1%" /t REG_SZ /d %popnew% /f
  44. reg add "%regpath%" /v "%findstr2%" /t REG_SZ /d %smtpnew% /f
  45. reg query "%regpath%" /v "%findstr1%" | findstr /i "%findstr1%"
  46. reg query "%regpath%" /v "%findstr2%" | findstr /i "%findstr2%"
  47. pause>nul
  48. goto over

  49. :over
  50. echo 处理完成
  51. pause>nul
  52. goto begin
复制代码
在第一个基础上,我想尝试使用for循环出路径,但是在for循环体内,好多函数都不可用,比如说if exist和reg add。
请求论坛高手帮忙解决一下,谢谢。
程序2
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :begin
  4. ::定义注册表路径循环
  5. for /l %%a in (3,1,3) do (
  6. Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a"
  7. echo regpath=!regpath!

  8. ::查找定义
  9. Set "findstr1=POP3 Server"
  10. Set "findstr2=SMTP Server"
  11. Set "find1=mail.imoke.org"
  12. Set "find2=mx8.dns.com.cn"
  13. Set "newpop=pop.imoke.org"
  14. Set "newsmtp=smtp.imoke.org"
  15. cls
  16. echo 搜索%%a
  17. echo !regpath!
  18. for /f "tokens=1* delims=_" %%1 in ('reg query "!regpath!" /v "!findstr1!" ^| findstr /i "!findstr1!"') do for /f "tokens=1*" %%3 in ("%%~2")do Set "a=%%4"
  19. echo a=!a!
  20. echo find=!find1!
  21.         ::如果相同则替换
  22.         if "!a!"=="!find1!" (
  23.         echo 相同
  24.         Set "path=!regpath!"
  25.         echo !path!
  26.         do reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d %newpop% /f
  27.         do reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d %newsmtp% /f
  28.         pause
  29.         else ( pause>nul )
  30.         )

  31. )

  32. ::main
  33. ::cls
  34. ::reg query "%regpath%" /v "%find1%" | findstr /i "%find1%"
  35. ::reg query "%regpath%" /v "%find2%" | findstr /i "%find2%"

  36. pause>nul
  37. goto begin
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2015-3-11 16:58:06 | 显示全部楼层
本帖最后由 pcl_test 于 2015-3-11 18:03 编辑

回复 1# mengqy
实现不难,把其中一项注册表结构截图或发附件(导出注册表文件亦可)看看,如HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000001的组成结构
发表于 2015-3-11 18:30:29 | 显示全部楼层
回复 1# mengqy
直接暴力修改
  1. @echo off
  2. for /l %%a in (1 1 4) do (
  3. reg add "HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a"  /v "POP3 Server" /t REG_SZ /d pop.imoke.org /f
  4. reg add "HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a"  /v "SMTP Server" /t REG_SZ /d smtp.imoke.org /f
  5. )
  6. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

 楼主| 发表于 2015-3-12 08:30:55 | 显示全部楼层
回复 3# pcl_test


    谢谢,可是实际情况不行。每个人的多个账户,可能是不同网站的邮箱,暴力修改了以后,其它邮箱就不能用了。
 楼主| 发表于 2015-3-12 08:32:32 | 显示全部楼层
回复 2# pcl_test


    其实组织结构什么的我觉得不是很重要,我只需要其中的两个键即可。结构就是:
HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000001
--POP server
--SMTP server
HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000002
--POP server
--SMTP server

下同
 楼主| 发表于 2015-3-12 08:34:12 | 显示全部楼层
这是我最新修改的代码,但是有BUG。
一、可能是Xp Sp2的原因,有的电脑上不能修改,没有效果。
二、如果这个人只有2个账户,执行后,会为其多添加三个账户。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :begin
  4. ::定义注册表路径循环
  5. for /l %%a in (1,1,5) do (
  6. Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a"
  7. echo regpath=!regpath!

  8. ::查找定义
  9. Set "findstr1=POP3 Server"
  10. Set "findstr2=SMTP Server"
  11. Set "find1=mail.rosedalesy.com.cn"
  12. Set "find2=mx8.dns.com.cn"
  13. Set "newpop=pop.rosedalesy.com.cn"
  14. Set "newsmtp=smtp.rosedalesy.com.cn"

  15. echo.
  16. echo 搜索%%a
  17. echo !regpath!
  18. if exist !regpath! (goto begin)
  19. for /f "tokens=1* delims=_" %%1 in ('reg query "!regpath!" /v "!findstr1!" ^| findstr /i "!findstr1!"') do for /f "tokens=1*" %%3 in ("%%~2")do Set "a=%%4"
  20. echo a=!a!
  21. echo find=!find1!
  22.         ::如果相同则替换
  23.         if "!a!"=="!find1!" (
  24.                 echo 执行修改
  25.                 echo !regpath!
  26.                 echo findstr1=!findstr1!
  27.                 echo findstr2=!findstr2!
  28.                 echo newpop=!newpop!
  29.                 echo newsmtp=!newsmtp!       
  30.                 reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d !newpop! /f
  31.                 reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d !newsmtp! /f
  32.                 )
  33.         if "!a!"=="!find2!" (
  34.                 echo 执行修改
  35.                 echo !regpath!
  36.                 echo findstr1=!findstr1!
  37.                 echo findstr2=!findstr2!
  38.                 echo newpop=!newpop!
  39.                 echo newsmtp=!newsmtp!       
  40.                 reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d !newpop! /f
  41.                 reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d !newsmtp! /f
  42.                 )
  43. pause>nul
  44. )

  45. cls
  46. echo 更新完成,按任意键退出。
  47. pause>nul
  48. exit
复制代码
 楼主| 发表于 2015-3-12 09:53:31 | 显示全部楼层
问题经过我的努力,已经完美解决。在win7和winxp32 sp3下测试无异常。
sp2暂时没有环境。

可实现功能:
1.可自定义注册表路径
2.可自定义要查找和替换的注册表的键名
3.可定义要修改的键值
4.可自定义是否只允许更新一次。
5.更多功能,请仔细阅读源码。


程序源码如下:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :: 中断当前OE进程
  4. taskkill /f /im msimn.exe
  5. ::检测是否更新过
  6. cls
  7. if exist "D:\HS\imoke\mailok.imoke" (
  8. echo.
  9. echo 您已更新过,重启Outlook Express测试。如果仍有问题,请联系电脑房,电话 3848,3818
  10. echo.
  11. echo 按任意键退出程序并重启Outlook Express......
  12. pause>nul
  13. start msimn.exe
  14. exit
  15. )
  16. :begin
  17. ::定义注册表路径循环
  18. for /l %%a in (1,1,5) do (
  19. Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a"

  20. ::查找定义
  21. Set "findstr1=POP3 Server"
  22. Set "findstr2=SMTP Server"
  23. Set "find1=mail.rosedalesy.com.cn"
  24. Set "find2=mx8.dns.com.cn"
  25. Set "newpop=pop.rosedalesy.com.cn"
  26. Set "newsmtp=smtp.rosedalesy.com.cn"
  27. Set a=""

  28. echo 搜索%%a
  29. echo !regpath!
  30. for /f "tokens=1* delims=_" %%1 in ('reg query "!regpath!" /v "!findstr1!" ^| findstr /i "!findstr1!"') do for /f "tokens=1*" %%3 in ("%%~2")do Set "a=%%4"
  31. echo a=!a!
  32. echo find=!find1!
  33.         ::如果相同则替换
  34.         if "!a!"=="!find1!" (
  35.                 echo 执行修改1
  36.                 echo !regpath!
  37.                 echo findstr1=!findstr1!
  38.                 echo findstr2=!findstr2!
  39.                 echo newpop=!newpop!
  40.                 echo newsmtp=!newsmtp!       
  41.                 reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d !newpop! /f
  42.                 reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d !newsmtp! /f
  43.                 )
  44.         if "!a!"=="!find2!" (
  45.                 echo 执行修改2
  46.                 echo !regpath!
  47.                 echo findstr1=!findstr1!
  48.                 echo findstr2=!findstr2!
  49.                 echo newpop=!newpop!
  50.                 echo newsmtp=!newsmtp!       
  51.                 reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d !newpop! /f
  52.                 reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d !newsmtp! /f
  53.                 )
  54. echo 查找%%a结束

  55. )
  56. )
  57. cls
  58. md D:\HS\imoke\
  59. echo %date% %time% 更新完成,按任意键退出。>>D:\HS\imoke\mailok.imoke
  60. start msimn.exe
  61. pause>nul
  62. exit
复制代码
发表于 2015-3-12 13:31:43 | 显示全部楼层
回复 4# mengqy
如果不一样,那就不要说是“批量统一更换”了,你没给出注册表的组织结构,那么只能参考你的修改代码,而要是你的修改代码有误,那么也只能跟着错,给出了注册表的组织结构,要是有误,那么就可以纠正
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 15:18 , Processed in 0.020362 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表