中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]替换注册表文件(.reg文件)中键值的路径
« [1] [2] »
作者:
标题: [求助]替换注册表文件(.reg文件)中键值的路径 上一主题 | 下一主题
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『楼 主』:  [求助]替换注册表文件(.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

2007-10-6 20:54
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 2 楼』:  


@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
注意字串可能被重复替换了。

   此帖被 +2 点积分    点击查看详情   
评分人:【 baikaifang 分数: +2  时间:2007-10-7 11:06


2007-10-7 02:58
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 3 楼』:  回复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 ]

2007-10-7 11:04
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 4 楼』:  

刚才试了一下,去掉set "str=!str:HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE\~SOFTWARE\Classes!"首尾的引号就可以了,有点不懂了,不知道什么时候该加引号,什么时候不加引号呢?

2007-10-7 11:16
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wudixin96
银牌会员





积分 1928
发帖 931
注册 2007-1-6
状态 离线
『第 5 楼』:  

一般情况下去了也没关系,不过还是建议加个引号为好。

2007-10-7 12:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 6 楼』:  



  Quote:
Originally posted by wudixin96 at 2007-10-7 12:51:
一般情况下去了也没关系,不过还是建议加个引号为好。

问题是我如果不去掉引号,字串替换就失败呀。就像我在3楼说的情况。

2007-10-7 13:45
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 7 楼』:  

RE baikaifang:

加了引号应该也可以的,也许是你的代码有问题,发出来看看。

另外,需要修改多个文件,可以用for命令遍历所有的*.reg文件,然后嵌套上面的for命令。

论坛有很多这样的代码的,搜索一下。

2007-10-7 18:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 8 楼』:  

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 ]

2007-10-7 19:42
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 9 楼』:  

刚才又试了一下将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

在我机子上居然也不行。

2007-10-7 20:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 10 楼』:  

你的是什么系统?

在我这里测试,一切正常。

2007-10-7 22:25
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 11 楼』:  

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 ]

2007-10-7 22:49
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 12 楼』:  

这和环境变量应该没什么关系。
看看你的文本文件保存的类型是不是ANSI?如果不是重新保存为ANSI类型的。

   此帖被 +2 点积分    点击查看详情   
评分人:【 baikaifang 分数: +2  时间:2007-10-7 23:08


2007-10-7 22:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 13 楼』:  

编码是ANSI的

2007-10-7 22:57
查看资料  发短消息 网志   编辑帖子  回复  引用回复
baikaifang
初级用户





积分 68
发帖 32
注册 2006-10-20
状态 离线
『第 14 楼』:  

非常感谢 lxmxn 问题找到了,原来注册表中导出的文件编码类型是Unicode ,用ANSI的编码方式另存为就可以了。

同时请问一下,如果将注册表文件用ANSI编码保存会不会丢失字符或其它问题

[ Last edited by baikaifang on 2007-10-7 at 11:13 PM ]

2007-10-7 23:08
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lxmxn
版主




积分 11386
发帖 4938
注册 2006-7-23
状态 离线
『第 15 楼』:  

应该不会出现丢失字符的问题。

例如编写注册表文件,一般都是用记事本来编写的,而记事本默认的保存编码类型是ANSI的,编写知道直接导入即可,没什么问题。

2007-10-7 23:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: