中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-06 01:08
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]替换注册表文件(.reg文件)中键值的路径 查看 2,042 回复 15
楼 主 [求助]替换注册表文件(.reg文件)中键值的路径 发表于 2007-10-06 20:54 ·  中国 湖南 永州 电信
初级用户
积分 68
发帖 32
注册 2006-10-20 12:14
19年会员
UID 67277
状态 离线
原本很想自己解决这个问题的,可苦于水平不够,在论坛里面泡了几天,按照相关替换字符的方法反复尝试,始终未能如愿。所以发贴求助,请会的朋友能指点一下,非常感谢。

测试用文件,假设为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 发表于 2007-10-07 02:58 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
@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

注意字串可能被重复替换了。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
baikaifang +2 2007-10-07 11:06
3 回复2楼 发表于 2007-10-07 11:04 ·  中国 湖南 永州 电信
初级用户
积分 68
发帖 32
注册 2006-10-20 12:14
19年会员
UID 67277
状态 离线
谢谢 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 发表于 2007-10-07 11:16 ·  中国 湖南 永州 电信
初级用户
积分 68
发帖 32
注册 2006-10-20 12:14
19年会员
UID 67277
状态 离线
刚才试了一下,去掉set "str=!str:HKEY_CLASSES_ROOT=HKEY_LOCAL_MACHINE\~SOFTWARE\Classes!"首尾的引号就可以了,有点不懂了,不知道什么时候该加引号,什么时候不加引号呢?
5 发表于 2007-10-07 12:51 ·  中国 香港 腾讯云
银牌会员
★★★
积分 1,928
发帖 931
注册 2007-01-06 11:46
19年会员
UID 75624
性别 男
状态 离线
一般情况下去了也没关系,不过还是建议加个引号为好。
6 发表于 2007-10-07 13:45 ·  中国 湖南 永州 电信
初级用户
积分 68
发帖 32
注册 2006-10-20 12:14
19年会员
UID 67277
状态 离线
Originally posted by wudixin96 at 2007-10-7 12:51:
一般情况下去了也没关系,不过还是建议加个引号为好。


问题是我如果不去掉引号,字串替换就失败呀。就像我在3楼说的情况。
7 发表于 2007-10-07 18:23 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
RE baikaifang:

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

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

论坛有很多这样的代码的,搜索一下。
8 发表于 2007-10-07 19:42 ·  中国 湖南 永州 电信
初级用户
积分 68
发帖 32
注册 2006-10-20 12:14
19年会员
UID 67277
状态 离线
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 发表于 2007-10-07 20:20 ·  中国 湖南 永州 电信
初级用户
积分 68
发帖 32
注册 2006-10-20 12:14
19年会员
UID 67277
状态 离线
刚才又试了一下将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 发表于 2007-10-07 22:25 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
你的是什么系统?

在我这里测试,一切正常。
11 发表于 2007-10-07 22:49 ·  中国 湖南 永州 电信
初级用户
积分 68
发帖 32
注册 2006-10-20 12:14
19年会员
UID 67277
状态 离线
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 发表于 2007-10-07 22:56 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
这和环境变量应该没什么关系。
看看你的文本文件保存的类型是不是ANSI?如果不是重新保存为ANSI类型的。
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
baikaifang +2 2007-10-07 23:08
13 发表于 2007-10-07 22:57 ·  中国 湖南 永州 电信
初级用户
积分 68
发帖 32
注册 2006-10-20 12:14
19年会员
UID 67277
状态 离线
编码是ANSI的
14 发表于 2007-10-07 23:08 ·  中国 湖南 永州 电信
初级用户
积分 68
发帖 32
注册 2006-10-20 12:14
19年会员
UID 67277
状态 离线
非常感谢 lxmxn 问题找到了,原来注册表中导出的文件编码类型是Unicode ,用ANSI的编码方式另存为就可以了。

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

[ Last edited by baikaifang on 2007-10-7 at 11:13 PM ]
15 发表于 2007-10-07 23:17 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
应该不会出现丢失字符的问题。

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