Board logo

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

作者: mengqy    时间: 2015-3-11 16:45     标题: [已解决]求高手能帮完善程序,实现批处理查询替换注册表键值

本帖最后由 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
复制代码

作者: pcl_test    时间: 2015-3-11 16:58

本帖最后由 pcl_test 于 2015-3-11 18:03 编辑

回复 1# mengqy
实现不难,把其中一项注册表结构截图或发附件(导出注册表文件亦可)看看,如HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000001的组成结构
作者: pcl_test    时间: 2015-3-11 18:30

回复 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
复制代码

作者: mengqy    时间: 2015-3-12 08:30

回复 3# pcl_test


    谢谢,可是实际情况不行。每个人的多个账户,可能是不同网站的邮箱,暴力修改了以后,其它邮箱就不能用了。
作者: mengqy    时间: 2015-3-12 08: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

下同
作者: mengqy    时间: 2015-3-12 08:34

这是我最新修改的代码,但是有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
复制代码

作者: mengqy    时间: 2015-3-12 09:53

问题经过我的努力,已经完美解决。在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
复制代码

作者: pcl_test    时间: 2015-3-12 13:31

回复 4# mengqy
如果不一样,那就不要说是“批量统一更换”了,你没给出注册表的组织结构,那么只能参考你的修改代码,而要是你的修改代码有误,那么也只能跟着错,给出了注册表的组织结构,要是有误,那么就可以纠正




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