中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-07-30 22:23
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 用Reg copy将注册表项A下所有复制到B下,自动应答不改写 查看 910 回复 4
楼 主 用Reg copy将注册表项A下所有复制到B下,自动应答不改写 发表于 2009-05-24 10:31 ·  中国 云南 昆明 电信
初级用户
★★
积分 76
发帖 64
注册 2008-04-24 23:56
18年会员
UID 116884
性别 男
状态 离线
用Reg copy将注册表项A下的所有子项和值复制到B下,如何自动应答不改写现存的子键和值

请教一条自动应答的问题,我要把一个注册表键下所有项复制到另一个,不覆盖已有的项。正常复制所有的命令是REG COPY HKLM\Software\Test HKCU\Software\Test /s ,然后在提示“值 已存在。要将其改写吗(是/否/全部)?”按N后回车。如果加/f参数,则自动覆盖. 我想不覆盖已在的键及值,实现自动应答"否",用以下echo n| REG COPY HKLM\Software\Test HKCU\Software\Test /s 却不对,貌似进死循环了(自动应答N对del命令是有效的)。请教各位大大

附测试用的test.reg.

我的平台为win2003 sp2

[ Last edited by dejoy on 2009-5-24 at 10:38 ]
附件
Test.rar (2.06 KiB, 下载次数: 12)
2 发表于 2009-05-24 20:26 ·  中国 广东 广州 番禺区 电信
初级用户
★★
l i u s s
积分 73
发帖 101
注册 2008-09-17 00:21
17年会员
UID 125825
性别 男
来自 GZ
状态 离线
可以用 reg query 读取注册表相关项或值,或用 reg export 导出注册表相关项,如果存在相关值就不复制。
3 发表于 2009-05-25 23:05 ·  中国 上海 华为云
初级用户
★★
积分 76
发帖 64
注册 2008-04-24 23:56
18年会员
UID 116884
性别 男
状态 离线
楼上的方法需要递归遍历所有的子键,如何写
4 注册表项之间的比较和复制方法 发表于 2009-05-28 06:57 ·  中国 广东 广州 电信
初级用户
★★
l i u s s
积分 73
发帖 101
注册 2008-09-17 00:21
17年会员
UID 125825
性别 男
来自 GZ
状态 离线

@echo off
set "key1=HKEY_LOCAL_MACHINE\SOFTWARE\Test"
set "key2=HKEY_CURRENT_USER\Software\Test"

reg export "%key1%" newxso1.reg >nul
reg export "%key2%" newxso2.reg >nul
(
echo Set objFSO = CreateObject^("Scripting.FileSystemObject"^)
echo Set Fa = objFSO.OpenTextFile^("newxso1.reg", 1, False, -1^)
echo Set Fb = objFSO.OpenTextFile^("newxso2.reg", 1, False, -1^)
echo strText = Fb.ReadAll
echo Do Until Fa.AtEndOfStream
echo strLine = Fa.ReadLine
echo If InStr^(strText, strLine^) = 0 Then
echo strLines = strLines ^& vbCrLf ^& strLine
echo End If
echo Loop
echo strLines = Replace^(strLines, "%key1%", "%key2%"^)
echo Wscript.Echo "Windows Registry Editor Version 5.00" ^& vbCrLf ^& strLines
)>newxso.vbs
cscript //nologo newxso.vbs>newxso.reg
regedit /s newxso.reg
del newxso*.*

以上功能相当于执行以下一行命令,选择不覆盖已存在项目:

reg copy HKLM\SOFTWARE\Test HKCU\Software\Test /s

之前曾经考虑过用 reg compare 命令来比较两个注册表项,找出不同地方来处理,但存在子项的时候,此方法行不通。如果使用全BAT代码形式,在处理存在一些特殊字符时可能出错,在比较文本内容方面,用VBS更易处理,通用性好。
5 发表于 2009-05-29 03:16 ·  中国 河南 驻马店 联通
新手上路
积分 7
发帖 10
注册 2006-11-06 01:52
19年会员
UID 69730
性别 男
状态 离线
学习了
论坛跳转: