Board logo

标题: 一段..reg 转.bat 的代码(reg命令) reg2bat [打印本页]

作者: 6622186     时间: 2007-8-9 23:10    标题: 一段..reg 转.bat 的代码(reg命令) reg2bat

我在 www.verybat.cn 发现了一段.reg 文件转 reg 命令的代码:

@echo off
color a
echo  请耐心等候...
setlocal enabledelayedexpansion
echo.>_tobat.bat
for /f "skip=2 tokens=*" %%i in ('type reg.reg') do (
set char=%%i
set char=!char:~0,1!
if !char!==[ (
set key=%%i
set key=!key:[HKEY_LOCAL_MACHINE=HKLM!
set key=!key:[HKEY_CURRENT_USER=HKCU!
set key=!key:[HKEY_CLASSES_ROOT=HKCR!
set key=!key:[HKEY_USER=HKU!
set key=!key:[HKEY_CUREENT_CONFIG=HKCC!
set key=!key:]=!
) else (
set vtd=%%i
for /f "tokens=1,2* delims==" %%i in ("!vtd!") do (
set v=%%i
set d=%%j
set t=REG_SZ
set type=!d:~0,4!
if !type!==dwor set t=REG_DWORD && set d=!d:dword:=!
if !type!==hex: set t=REG_BINARY && set d=!d:,=! && d=!d:hex:=!
echo reg add "!key!" /v !v! /t !t! /d !d! /f>>_tobat.bat
)
)
)


这是一段非常精妙的代码, 不过处理二进制值和默认值会出现问题.于是我将其修改为:

@echo off
setlocal enabledelayedexpansion
echo @echo off>%~n1.bat
for /f "skip=2 eol=' tokens=*" %%i in ('type %~1') do (
set char=%%i
set char=!char:~0,1!
if !char!==[- goto del
if !char!==[ (
set key=%%i
set key=!key:[HKEY_LOCAL_MACHINE=HKLM!
set key=!key:[HKEY_CURRENT_USER=HKCU!
set key=!key:[HKEY_CLASSES_ROOT=HKCR!
set key=!key:[HKEY_USERS=HKU!
set key=!key:[HKEY_CUREENT_CONFIG=HKCC!
set key=!key:]=!
) else (
set vtd=%%i
for /f "tokens=1,2* delims==" %%i in ("!vtd!") do (
set v=%%i
set d=%%j
set type=!d:~0,4!
set t=reg_sz
if !type!==dwor set t=reg_dword&set d=!d:dword:=!&set d=0x!d!
if !type!==hex: set t=reg_binary&set d=!d:hex:=!&set d=!d:,=!
set d=!d:\\=\!
set d=!d:%%=%%%%!
if !v!==@ set v=""
echo reg add "!key!" /v !v! /t !t! /d !d! /f>>%~n1.bat
)
)
)
type %~n1.bat | find "reg">nul 2>nul&&goto :eof

:del
set key=!key:[-HKEY_LOCAL_MACHINE=HKLM!
set key=!key:[-HKEY_CURRENT_USER=HKCU!
set key=!key:[-HKEY_CLASSES_ROOT=HKCR!
set key=!key:[-HKEY_USERS=HKU!
set key=!key:[-HKEY_CUREENT_CONFIG=HKCC!
set key=!key:]=!
echo reg delete "!key!" /f >>%~n1.bat

这段代码增加了以下功能:

1 去掉二进制分隔符, 使其能处理二进制数据.
2 增强dword的处理功能,使其值大于9时,而不会产生错误.
3 增加了对默认值的处理.
4 增加了对百分号和双斜杠的处理.
5 增加了对以'开头的注释行的处理.
6 增加了对删除子键的.reg文件的处理(必须手工编辑,注册表无法导出这样的文件)

修改后的代码虽然对转换后文件一般能正确执行(符合.reg文件的原意),但是无法体现 reg 命令的使用技巧.比如处理后dword值特别繁琐,如其值为0时,可不用/d参数.并且对默认值的处理没有使用/ve 参数,而将其设为"".还有虽然能处理删除子键,但是其下如果有其它值,将不作处理.曾把默认值处理为 /ve ,但是和处理删除子键一样.
没有对可扩充字符串值hex(2)作处理,因为根本就无法处理.

[ Last edited by 6622186 on 2007-8-10 at 10:22 AM ]
作者: vkill     时间: 2007-8-10 12:02
用echo的话特殊字符始终无法避免
作者: 6622186     时间: 2007-8-10 20:43
v t d 的值都是带引号的, 可以处理特殊字符. "!vtd!"
作者: slore     时间: 2007-8-14 12:07
没有对可扩充字符串值hex(2)作处理,因为根本就无法处理.
????
为什么不能处理?
作者: 6622186     时间: 2007-8-14 21:06
至少我不能处理, 再就是实用性,毕竟这种数据不是很多.如果要转换还不如用 reg add 方便.

比如 一个 reg_expand_sz 的数据是 %win%\regedit.exe %1, 导出后就会变成像 binary 以逗号分隔的值.
我也没有这种转换工具. 也难怪叫 hex(2)。 .inf 文件也没有这个问题.

还有像什么 hex(5)..., 这个数据类型就更少见了. 而常用就这四种类型(不包括默认值).
作者: xqx     时间: 2010-8-12 06:21    标题: 这是干么用的

是把别人的.reg 文件转成自己的.bat命令?
我先下来再说!




欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) Powered by Discuz! 2.5