![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-06 00:11 |
共 48,039 主题排行 / 350,124 发帖 / 今日 2 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [求助]替换注册表文件(.reg文件)中键值的路径 |
| 可打印版本 2,037 / 15 |
| 第1楼 baikaifang | 发表于 2007-10-06 20:54 |
| 初级用户 发帖 32 积分 68 | |
|
[求助]替换注册表文件(.reg文件)中键值的路径 原本很想自己解决这个问题的,可苦于水平不够,在论坛里面泡了几天,按照相关替换字符的方法反复尝试,始终未能如愿。所以发贴求助,请会的朋友能指点一下,非常感谢。
测试用文件,假设为1.reg(其实很多reg文件在同一文件夹不同子文夹内,都需要替换的,此处先解决单个文件问题),文件内容如下: 未替换前1.reg文件内容: ---------------------------------------------------------------------------------------------------------- Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\CLSID\{1AF34165-6CA9-4F08-BC21-49AEDC68D828}] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall] HKEY_CURRENT_USER\Software\RealNetworks\RealJukebox\Search Engines] [HKEY_USERS\.DEFAULT\Environment] ---------------------------------------------------------------------------------------------------------- 替换后1.reg文件内容: ---------------------------------------------------------------------------------------------------------- Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\~SOFTWARE\Classes\CLSID\{1AF34165-6CA9-4F08-BC21-49AEDC68D828}] [HKEY_LOCAL_MACHINE\~SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall] HKEY_USERS\CURRENT\Software\RealNetworks\RealJukebox\Search Engines] [HKEY_USERS\NAME\.DEFAULT\Environment] ---------------------------------------------------------------------------------------------------------- 上面相同颜色和下面相同颜的分别表示修改前和修改后的。像HKEY_LOCAL_MACHINE\SOFTWARE最好整串替换成HKEY_LOCAL_MACHINE\~SOFTWARE,而不是只将SOFTWARE替换成~SOTWARE,之所以这样是因为注册表文件中有很多SOFTWARE,我只需要将HKEY_LOCAL_MACHINE\SOFTWARE这样格式后面的SOFTWARE替换成~SOFTWARE |
|
| 第2楼 lxmxn | 发表于 2007-10-07 02:58 |
| 版主 发帖 4,938 积分 11,386 | |
|
注意字串可能被重复替换了。 |
|
| 第3楼 baikaifang | 发表于 2007-10-07 11:04 |
| 初级用户 发帖 32 积分 68 | |
|
回复2楼 谢谢 lxmxn 帮助,上面的代码可以。另在发贴之前我曾根据下面链接贴子中第6楼你发的代码尝试修改实现1楼的要求,可是没有成功,不知道是为什么!
标题: 关于替换文本内的敏感字符问题????在线等!! http://www.cn-dos.net/forum/viewthread.php?tid=27005 6楼的代码: @echo off&setlocal enabledelayedexpansion&set file=%random% for /f "delims=" %%a in (1.txt) do ( set str=%%a set "str=!str:>>=^>^>!" >>%file% echo !str! ) start notepad %file% exit/b 我将其中的1.txt改成1.reg、 set "str=!str:>>=^>^>!" 等号两边的内容改成我需要替换的,set "str=!str:HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE\~SOFTWARE\Classes!" 却不行。 另外,如果需要替换多个REG文件(所有的文件分布在一个主文件夹下不同的子文件夹),不知道该怎么改成上面的代码,还有你上面的代码是显示修改后的内容,我想直接修改原REG里的内容,如果不能直接修改原REG的内容,将修改后的重新输出到新文件中也行。 [ Last edited by baikaifang on 2007-10-7 at 11:10 AM ] |
|
| 第4楼 baikaifang | 发表于 2007-10-07 11:16 |
| 初级用户 发帖 32 积分 68 | |
|
刚才试了一下,去掉set "str=!str:HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE\~SOFTWARE\Classes!"首尾的引号就可以了,有点不懂了,不知道什么时候该加引号,什么时候不加引号呢?
|
|
| 第5楼 wudixin96 | 发表于 2007-10-07 12:51 |
| 银牌会员 发帖 931 积分 1,928 | |
|
一般情况下去了也没关系,不过还是建议加个引号为好。
|
|
| 第6楼 baikaifang | 发表于 2007-10-07 13:45 |
| 初级用户 发帖 32 积分 68 | |
Originally posted by wudixin96 at 2007-10-7 12:51: 问题是我如果不去掉引号,字串替换就失败呀。就像我在3楼说的情况。 |
|
| 第7楼 lxmxn | 发表于 2007-10-07 18:23 |
| 版主 发帖 4,938 积分 11,386 | |
|
RE baikaifang:
加了引号应该也可以的,也许是你的代码有问题,发出来看看。 另外,需要修改多个文件,可以用for命令遍历所有的*.reg文件,然后嵌套上面的for命令。 论坛有很多这样的代码的,搜索一下。 |
|
| 第8楼 baikaifang | 发表于 2007-10-07 19:42 |
| 初级用户 发帖 32 积分 68 | |
|
RE lxmxn:
我用的代码如下: @echo off&setlocal enabledelayedexpansion&set file=%random% for /f "delims=" %%a in (1.reg) do ( set str=%%a set "str=!str:HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE\~SOFTWARE\Classes!" >>%file% echo !str! ) start notepad %file% exit/b 另外用2楼的代码也不能替换下面的1.reg的字串。 1.reg内容: Windows Registry Editor Version 5.00 @="" "Backup"=- @="" "Backup"=- @="" "Backup"=- @="" 我去掉批处理中的@echo off后观看代码的执行过程,看到FOR并没有把上面的内容传给%%a,所以就没有完成替换。 但却可以替换下面1.reg中的内容 ---------------------------------------------------------------------------------------------------------- Windows Registry Editor Version 5.00 ---------------------------------------------------------------------------------------------------------- [ Last edited by baikaifang on 2007-10-7 at 08:15 PM ] |
|
| 第9楼 baikaifang | 发表于 2007-10-07 20:20 |
| 初级用户 发帖 32 积分 68 | |
|
刚才又试了一下将1.reg的内容改成如下就一行字串:
HKEY_CLASSES_ROOT 批处理 @echo off&SetLocal EnableDelayedExpansion for /f "delims=" %%a in (1.reg) do ( set string=%%a set "string=!string:HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE\~SOFTWARE\Classes!" echo !string! ) PAUSE 在我机子上居然也不行。 |
|
| 第10楼 lxmxn | 发表于 2007-10-07 22:25 |
| 版主 发帖 4,938 积分 11,386 | |
|
你的是什么系统?
在我这里测试,一切正常。 |
|
| 第11楼 baikaifang | 发表于 2007-10-07 22:49 |
| 初级用户 发帖 32 积分 68 | |
|
XPSP2
我感觉问题好像出在FOR上面,另外问下版主,出现这种问题不知道和环境变量有没有关系。 下面是我机子的环境变量 ALLUSERSPROFILE=C:\Documents and Settings\All Users APPDATA=C:\Documents and Settings\Administrator\Application Data CLIENTNAME=Console CommonProgramFiles=C:\Program Files\Common Files COMPUTERNAME=1DF4D2340491459 ComSpec=C:\WINDOWS\system32\cmd.exe FP_NO_HOST_CHECK=NO HOMEDRIVE=C: HOMEPATH=\Documents and Settings\Administrator LOGONSERVER=\\1DF4D2340491459 NUMBER_OF_PROCESSORS=1 OS=Windows_NT Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH PROCESSOR_ARCHITECTURE=x86 PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 10, GenuineIntel PROCESSOR_LEVEL=6 PROCESSOR_REVISION=080a ProgramFiles=C:\Program Files PROMPT=$P$G SESSIONNAME=Console SystemDrive=C: SystemRoot=C:\WINDOWS TEMP=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp TMP=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp USERDOMAIN=1DF4D2340491459 USERNAME=Administrator USERPROFILE=C:\Documents and Settings\Administrator windir=C:\WINDOWS Microsoft Windows XP [ Last edited by baikaifang on 2007-10-7 at 10:52 PM ] |
|
| 第12楼 lxmxn | 发表于 2007-10-07 22:56 |
| 版主 发帖 4,938 积分 11,386 | |
|
这和环境变量应该没什么关系。
看看你的文本文件保存的类型是不是ANSI?如果不是重新保存为ANSI类型的。 |
|
| 第13楼 baikaifang | 发表于 2007-10-07 22:57 |
| 初级用户 发帖 32 积分 68 | |
|
编码是ANSI的
|
|
| 第14楼 baikaifang | 发表于 2007-10-07 23:08 |
| 初级用户 发帖 32 积分 68 | |
|
非常感谢 lxmxn 问题找到了,原来注册表中导出的文件编码类型是Unicode ,用ANSI的编码方式另存为就可以了。
同时请问一下,如果将注册表文件用ANSI编码保存会不会丢失字符或其它问题 [ Last edited by baikaifang on 2007-10-7 at 11:13 PM ] |
|
| 第15楼 lxmxn | 发表于 2007-10-07 23:17 |
| 版主 发帖 4,938 积分 11,386 | |
|
应该不会出现丢失字符的问题。
例如编写注册表文件,一般都是用记事本来编写的,而记事本默认的保存编码类型是ANSI的,编写知道直接导入即可,没什么问题。 |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |