标题: [求助]替换注册表文件(.reg文件)中键值的路径
[打印本页]
作者: baikaifang
时间: 2007-10-6 20:54
标题: [求助]替换注册表文件(.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
作者: lxmxn
时间: 2007-10-7 02:58
@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!
set string=!string:HKEY_LOCAL_MACHINE\SOFTWARE=HKEY_LOCAL_MACHINE\~SOFTWARE!
set string=!string:-HKEY_CURRENT_USER=-HKEY_USERS\CURRENT!
set string=!string:HKEY_USERS=HKEY_USERS\NAME!
ECHO !STRING!
)
PAUSE
注意字串可能被重复替换了。
作者: baikaifang
时间: 2007-10-7 11:04
标题: 回复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 ]
作者: baikaifang
时间: 2007-10-7 11:16
刚才试了一下,去掉set "str=!str:HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE\~SOFTWARE\Classes!"首尾的引号就可以了,有点不懂了,不知道什么时候该加引号,什么时候不加引号呢?
作者: wudixin96
时间: 2007-10-7 12:51
一般情况下去了也没关系,不过还是建议加个引号为好。
作者: baikaifang
时间: 2007-10-7 13:45
Quote: |
Originally posted by wudixin96 at 2007-10-7 12:51:
一般情况下去了也没关系,不过还是建议加个引号为好。 |
|
问题是我如果不去掉引号,字串替换就失败呀。就像我在3楼说的情况。
作者: lxmxn
时间: 2007-10-7 18:23
RE baikaifang:
加了引号应该也可以的,也许是你的代码有问题,发出来看看。
另外,需要修改多个文件,可以用for命令遍历所有的*.reg文件,然后嵌套上面的for命令。
论坛有很多这样的代码的,搜索一下。
作者: baikaifang
时间: 2007-10-7 19:42
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
[HKEY_CLASSES_ROOT\.APE]
@=""
"Backup"=-
[HKEY_CLASSES_ROOT\.CUE]
@=""
"Backup"=-
[HKEY_CLASSES_ROOT\.DTS]
@=""
"Backup"=-
[HKEY_CLASSES_ROOT\.DTSWAV]
@=""
我去掉批处理中的@echo off后观看代码的执行过程,看到FOR并没有把上面的内容传给%%a,所以就没有完成替换。
但却可以替换下面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]
----------------------------------------------------------------------------------------------------------
[
Last edited by baikaifang on 2007-10-7 at 08:15 PM ]
作者: baikaifang
时间: 2007-10-7 20:20
刚才又试了一下将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
在我机子上居然也不行。
作者: lxmxn
时间: 2007-10-7 22:25
你的是什么系统?
在我这里测试,一切正常。
作者: baikaifang
时间: 2007-10-7 22:49
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 [版本 5.1.2600]
[
Last edited by baikaifang on 2007-10-7 at 10:52 PM ]
作者: lxmxn
时间: 2007-10-7 22:56
这和环境变量应该没什么关系。
看看你的文本文件保存的类型是不是ANSI?如果不是重新保存为ANSI类型的。
作者: baikaifang
时间: 2007-10-7 22:57
编码是ANSI的
作者: baikaifang
时间: 2007-10-7 23:08
非常感谢 lxmxn 问题找到了,原来注册表中导出的文件编码类型是Unicode ,用ANSI的编码方式另存为就可以了。
同时请问一下,如果将注册表文件用ANSI编码保存会不会丢失字符或其它问题
[
Last edited by baikaifang on 2007-10-7 at 11:13 PM ]
作者: lxmxn
时间: 2007-10-7 23:17
应该不会出现丢失字符的问题。
例如编写注册表文件,一般都是用记事本来编写的,而记事本默认的保存编码类型是ANSI的,编写知道直接导入即可,没什么问题。
作者: baikaifang
时间: 2007-10-7 23:22
我现在不是编写注册表文件,而是直接修改从注册表编辑器regedit 里面导出来的文件,希望没有影响。