原帖由 沙漠之子 于 2007-1-18 02:19 PM 发表
来自vkill' Blog:http://blog.yx127.com/?action=show&id=192
sed下载:http://www.yx127.com/tools/sed_4.0.7x.rar
原下载地址有问题,故直接从vkill'tool中引过来
[quote]
@echo off
setlocal enabledelayedexpansion
title reg2bat by:vkill
::注意:注册表项中不可有=,项目、名字、数值中不可有"
::config
set "temp=temp_.txt"
set "life_b=bats_.bat"
:test
cls
if not *%1==* (set "life_r=%1") else (
echo 只支持单文件,多文件请使用*.reg
set life_r=
set /p life_r=请把要转化的reg文件拖到本窗口:
if %life_r%*==* goto test)
call :000 %life_r%
goto :eof
:000
echo "%~1"|sed "s/\x22$//"|(findstr /E /I ".reg">nul ||(echo sorry要处理的不是reg文件&pause>nul&goto :eof))
if not exist "%~1" (echo sorry要处理reg文件不存在&pause>nul&goto :eof)
::去除.reg的表头和所有空格
if exist %temp%? del /f/q %temp%?
type "%~1"|sed -e "/^REGEDIT4$/d;/^Windows Registry Editor Version 5.00$/d;/^$/d" -e "y/[/#/" |more>%temp%1
cls
::显示错误并自动除错
cd.>%temp%2
sed "/^#HKEY_.*\.*]/d;/^.*=.*$/d" %temp%1|more>%temp%2
findstr . %temp%2>nul ||(copy /y %temp%1 %temp%3>nul &goto start_)
echo .reg文件中有错误,1秒后开始自动除错
ping -n 2 127.1>nul
sed -e "/^#HKEY_.*\.*]/b;/^.*=.*$/b" -e d %temp%1|more>%temp%3
echo 除错完成
:start_
:去除[]",并转换数据类型,可继续添加数据类型
sed -e "s/^#//;s/]$//" -e "s/\x22//g" %temp%3 |sed "s/=/=REG_SZ=/" |sed "s/=REG_SZ=dword:/=REG_DWORD=/;s/=REG_SZ=hex:/=REG_BINARY=/;s/=REG_SZ=hex(7):/=REG_MULTI_SZ=/;s/=REG_SZ=hex(2):/=REG_EXPAND_SZ=/" |sed "s/^[ \t]*//;s/[ \t]*$//" |sed "/^$/d"|more>%temp%4
::写日志
>>%life_b% echo :: %date% %time% 添加
::写reg add
for /f "tokens=1-3 delims==" %%a in (%temp%4) do (
if not *%%b==* (if not !xiang!*==* >>%life_b% echo reg add "!xiang!" /v "%%~a" /t %%~b /d "%%~c" /f) else (set "xiang=%%~a")
)
if exist %life_b% (
echo 正在删除%life_b%中的相同行
ren %life_b% %temp%5
sed -n "G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P" %temp%5 |more>%life_b%
echo %life_b%中的相同行删除完成
)
del /f/q %temp%?
echo ok %life_r%2bat转换完成,结果保存在了%life_b%文件中,程序1秒后自动退出
ping -n 3 127.1>nul
goto :eof
[/quote]
原代码是有点问题
- if not *%1==* (set "life_r=%1") else (
- echo 只支持单文件,多文件请使用*.reg
- set life_r=
- set /p life_r=请把要转化的reg文件拖到本窗口:
- if %life_r%*==* goto test
- )
复制代码
改为
- if not *%1==* (set "life_r=%1") else (
- echo 只支持单文件,多文件请使用*.reg
- set life_r=
- set /p life_r=请把要转化的reg文件拖到本窗口:
- )
- if %life_r%*==* goto test
-
复制代码
/////////////////////////////////////////////////////////////////////////////////////
能否改进当非reg,文件不存在goto test
HKEY_CURRENT_USER -->HKCU
HKEY_CLASSES_ROOTHKCR -->HKCR
HKEY_LOCAL_MACHINE -->HKLM
HKEY_USERS -->HKU
HKEY_CURRENT_CONFIG -->HKCC
存在问题
[HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Common\Licensing]
"1EBDE4BC9A514630B5412561FA45CCC5"=hex:02,00,00,00,27,00,00,00,7b,39,30,31,31,\
30,38,30,34,2d,36,30,30,30,2d,31,31,44,33,2d,38,43,46,45,2d,30,31,35,30,30,\
34,38,33,38,33,43,39,7d,00,56,00,00,00,4d,00,69,00,63,00,72,00,6f,00,73,00,\
6f,00,66,00,74,00,20,00,4f,00,66,00,66,00,69,00,63,00,65,00,20,00,50,00,72,\
00,6f,00,66,00,65,00,73,00,73,00,69,00,6f,00,6e,00,61,00,6c,00,20,00,45,00,\
64,00,69,00,74,00,69,00,6f,00,6e,00,20,00,32,00,30,00,30,00,33,00,00,00
转换成了:
reg add "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Common\Licensing" /v "1EBDE4BC9A514630B5412561FA45CCC5" /t REG_BINARY /d "02,00,00,00,27,00,00,00,7b,39,30,31,31,\" /f
而实际是将数值部分的,\去掉并连成一行
如:
For %%I In (as asm bat cfg cpp cs css diff html java js mak nfo nsi pas pl py rb rc reg sql txt vb vbs xml) Do (
REG ADD "HKCU\Software\Notepad2\Styles\%%I" /v 32 /t REG_BINARY /d 360000005461686f6d61006c0000000000000000000000000000000000000000000000000c0000000000000000000000000000000000 /f >nul
)
附:1.Sed命令在压缩包中
附:2.REG ADD 命令
REG ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data] [/f]
KeyName [\\Machine\]FullKey
远程机器的机器名 - 忽略默认到当前机器。
远程机器上只有 HKLM 和 HKU。
FullKey ROOTKEY\SubKey
ROOTKEY [ HKLM | HKCU | HKCR | HKU | HKCC ]
SubKey 所选 ROOTKEY 下注册表项的完整名
/v 所选项之下要添加的值名
/ve 为注册表项添加空白值名<无名称>
/t RegKey 数据类型
[ REG_SZ | REG_MULTI_SZ | REG_DWORD_BIG_ENDIAN |
REG_DWORD | REG_BINARY | REG_DWORD_LITTLE_ENDIAN |
REG_NONE | REG_EXPAND_SZ ]
如果忽略,则采用 REG_SZ
/s 指定一个在 REG_MULTI_SZ 数据字符串中
用作分隔符的字符
如果忽略,则将 "\0" 用作分隔符
/d 要分配给添加的注册表 ValueName 的数据
/f 不用提示就强行改写现有注册表项
例如:
REG ADD \\ABC\HKLM\Software\MyCo
添加远程机器 ABC 上的一个注册表项 HKLM\Software\MyCo
REG ADD HKLM\Software\MyCo /v Data /t REG_BINARY /d fe340ead
添加一个值(名称: Data,类型: REG_BINARY,数据: fe340ead)
REG ADD HKLM\Software\MyCo /v MRU /t REG_MULTI_SZ /d fax\0mail
添加一个值(名称: MRU,类型: REG_MUTLI_SZ,数据: fax\0mail\0\0)
REG ADD HKLM\Software\MyCo /v Path /t REG_EXPAND_SZ /d %%systemroot%%
添加一个值(名称: Path,类型: REG_EXPAND_SZ,数据: %systemroot%)
注意: 在扩充字符串中使用双百分比符号( %% )
附:3.REG文件及INF插件注册表项结构图
[ 本帖最后由 沙漠之子 于 2007-1-19 06:10 PM 编辑 ] |