标题: [注册表类] [已解决]求高手能帮完善程序,实现批处理查询替换注册表键值 [打印本页]
作者: 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是否相同,都进行替换。
(设置的是,如果相同,则替换,如果不同,则忽略)以下是程序:- @echo off
- :begin
- cls
- Set "regpath1=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000001"
- Set "regpath2=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000002"
- Set "regpath3=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000003"
- Set "regpath4=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000004"
- Set "regpath5=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000005"
- Set "findstr1=POP3 Server"
- Set "findstr2=SMTP Server"
- Set "popold=mail.imoke.org"
- Set "popnew=pop.imoke.org"
- Set "smtpold=mail.imoke.org"
- Set "smtpnew=smtp.imoke.org"
- reg query "%regpath1%" /v "%findstr1%" | findstr /i "%findstr1%"
- reg query "%regpath1%" /v "%findstr2%" | findstr /i "%findstr2%"
- reg query "%regpath2%" /v "%findstr1%" | findstr /i "%findstr1%"
- reg query "%regpath2%" /v "%findstr2%" | findstr /i "%findstr2%"
-
- :search1
- echo 搜索1
- 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"
- echo %a%
- if "%a%"=="%popold%" (
- Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000001"
- goto do
- else (goto search2)
- )
-
- :search2
- echo 搜索2
- 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"
- echo %a%
- if "%a%"=="%popold%" (
- Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\00000002"
- goto do
- else (goto search1)
- )
-
- ::替换过程
- :do
- echo %regpath%
- pause
- echo.
- echo 执行修改
- reg add "%regpath%" /v "%findstr1%" /t REG_SZ /d %popnew% /f
- reg add "%regpath%" /v "%findstr2%" /t REG_SZ /d %smtpnew% /f
- reg query "%regpath%" /v "%findstr1%" | findstr /i "%findstr1%"
- reg query "%regpath%" /v "%findstr2%" | findstr /i "%findstr2%"
- pause>nul
- goto over
-
- :over
- echo 处理完成
- pause>nul
- goto begin
复制代码
在第一个基础上,我想尝试使用for循环出路径,但是在for循环体内,好多函数都不可用,比如说if exist和reg add。
请求论坛高手帮忙解决一下,谢谢。
程序2- @echo off
- setlocal enabledelayedexpansion
- :begin
- ::定义注册表路径循环
- for /l %%a in (3,1,3) do (
- Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a"
- echo regpath=!regpath!
-
- ::查找定义
- Set "findstr1=POP3 Server"
- Set "findstr2=SMTP Server"
- Set "find1=mail.imoke.org"
- Set "find2=mx8.dns.com.cn"
- Set "newpop=pop.imoke.org"
- Set "newsmtp=smtp.imoke.org"
- cls
- echo 搜索%%a
- echo !regpath!
- 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"
- echo a=!a!
- echo find=!find1!
- ::如果相同则替换
- if "!a!"=="!find1!" (
- echo 相同
- Set "path=!regpath!"
- echo !path!
- do reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d %newpop% /f
- do reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d %newsmtp% /f
- pause
- else ( pause>nul )
- )
-
- )
-
- ::main
- ::cls
- ::reg query "%regpath%" /v "%find1%" | findstr /i "%find1%"
- ::reg query "%regpath%" /v "%find2%" | findstr /i "%find2%"
-
- pause>nul
- 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
直接暴力修改- @echo off
- for /l %%a in (1 1 4) do (
- reg add "HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a" /v "POP3 Server" /t REG_SZ /d pop.imoke.org /f
- reg add "HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a" /v "SMTP Server" /t REG_SZ /d smtp.imoke.org /f
- )
- 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个账户,执行后,会为其多添加三个账户。- @echo off
- setlocal enabledelayedexpansion
- :begin
- ::定义注册表路径循环
- for /l %%a in (1,1,5) do (
- Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a"
- echo regpath=!regpath!
-
- ::查找定义
- Set "findstr1=POP3 Server"
- Set "findstr2=SMTP Server"
- Set "find1=mail.rosedalesy.com.cn"
- Set "find2=mx8.dns.com.cn"
- Set "newpop=pop.rosedalesy.com.cn"
- Set "newsmtp=smtp.rosedalesy.com.cn"
-
- echo.
- echo 搜索%%a
- echo !regpath!
- if exist !regpath! (goto begin)
- 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"
- echo a=!a!
- echo find=!find1!
- ::如果相同则替换
- if "!a!"=="!find1!" (
- echo 执行修改
- echo !regpath!
- echo findstr1=!findstr1!
- echo findstr2=!findstr2!
- echo newpop=!newpop!
- echo newsmtp=!newsmtp!
- reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d !newpop! /f
- reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d !newsmtp! /f
- )
- if "!a!"=="!find2!" (
- echo 执行修改
- echo !regpath!
- echo findstr1=!findstr1!
- echo findstr2=!findstr2!
- echo newpop=!newpop!
- echo newsmtp=!newsmtp!
- reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d !newpop! /f
- reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d !newsmtp! /f
- )
- pause>nul
- )
-
- cls
- echo 更新完成,按任意键退出。
- pause>nul
- exit
复制代码
作者: mengqy 时间: 2015-3-12 09:53
问题经过我的努力,已经完美解决。在win7和winxp32 sp3下测试无异常。
sp2暂时没有环境。
可实现功能:
1.可自定义注册表路径
2.可自定义要查找和替换的注册表的键名
3.可定义要修改的键值
4.可自定义是否只允许更新一次。
5.更多功能,请仔细阅读源码。
程序源码如下:- @echo off
- setlocal enabledelayedexpansion
- :: 中断当前OE进程
- taskkill /f /im msimn.exe
- ::检测是否更新过
- cls
- if exist "D:\HS\imoke\mailok.imoke" (
- echo.
- echo 您已更新过,重启Outlook Express测试。如果仍有问题,请联系电脑房,电话 3848,3818
- echo.
- echo 按任意键退出程序并重启Outlook Express......
- pause>nul
- start msimn.exe
- exit
- )
- :begin
- ::定义注册表路径循环
- for /l %%a in (1,1,5) do (
- Set "regpath=HKCU\Software\Microsoft\Internet Account Manager\Accounts\0000000%%a"
-
- ::查找定义
- Set "findstr1=POP3 Server"
- Set "findstr2=SMTP Server"
- Set "find1=mail.rosedalesy.com.cn"
- Set "find2=mx8.dns.com.cn"
- Set "newpop=pop.rosedalesy.com.cn"
- Set "newsmtp=smtp.rosedalesy.com.cn"
- Set a=""
-
- echo 搜索%%a
- echo !regpath!
- 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"
- echo a=!a!
- echo find=!find1!
- ::如果相同则替换
- if "!a!"=="!find1!" (
- echo 执行修改1
- echo !regpath!
- echo findstr1=!findstr1!
- echo findstr2=!findstr2!
- echo newpop=!newpop!
- echo newsmtp=!newsmtp!
- reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d !newpop! /f
- reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d !newsmtp! /f
- )
- if "!a!"=="!find2!" (
- echo 执行修改2
- echo !regpath!
- echo findstr1=!findstr1!
- echo findstr2=!findstr2!
- echo newpop=!newpop!
- echo newsmtp=!newsmtp!
- reg add "!regpath!" /v "!findstr1!" /t REG_SZ /d !newpop! /f
- reg add "!regpath!" /v "!findstr2!" /t REG_SZ /d !newsmtp! /f
- )
- echo 查找%%a结束
-
- )
- )
- cls
- md D:\HS\imoke\
- echo %date% %time% 更新完成,按任意键退出。>>D:\HS\imoke\mailok.imoke
- start msimn.exe
- pause>nul
- exit
复制代码
作者: pcl_test 时间: 2015-3-12 13:31
回复 4# mengqy
如果不一样,那就不要说是“批量统一更换”了,你没给出注册表的组织结构,那么只能参考你的修改代码,而要是你的修改代码有误,那么也只能跟着错,给出了注册表的组织结构,要是有误,那么就可以纠正
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |