无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 6377|回复: 6
打印 上一主题 下一主题

那位大大能够改进一下reg2bat这个P处理文件

[复制链接]
跳转到指定楼层
1#
发表于 2007-1-19 18:09:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原帖由 沙漠之子 于 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]

原代码是有点问题
  1. if not *%1==* (set "life_r=%1") else (
  2.     echo 只支持单文件,多文件请使用*.reg
  3.     set life_r=
  4.     set /p life_r=请把要转化的reg文件拖到本窗口:
  5.     if %life_r%*==* goto test
  6.                                       )
复制代码


改为
  1. if not *%1==* (set "life_r=%1") else (
  2.     echo 只支持单文件,多文件请使用*.reg
  3.     set life_r=
  4.     set /p life_r=请把要转化的reg文件拖到本窗口:
  5.      )   
  6. if %life_r%*==* goto test
  7.                                     
复制代码


/////////////////////////////////////////////////////////////////////////////////////

能否改进当非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 编辑 ]
2#
发表于 2007-1-22 20:56:32 | 只看该作者
因为sed是文本文件行编辑器,所以不在一行的不好处理,属特殊情况,修改下应该可以用
回复

使用道具 举报

3#
发表于 2007-6-21 08:32:31 | 只看该作者
原帖由 he200377 于 2007-1-22 08:56 PM 发表
因为sed是文本文件行编辑器,所以不在一行的不好处理,属特殊情况,修改下应该可以用


当然能完善一下更好!
回复

使用道具 举报

4#
发表于 2007-6-23 12:31:56 | 只看该作者
直接用reg命令不好处理,不如用这个。原理是reg文件----bat文件,写入原理是bat文件----reg文件,然后在导入这个reg文件。

@echo off
title reg文件转换成bat文件

:input
echo.
set /p regf=请输入要转换的注册表文件名:
if not exist %regf% (echo                                           ... 不存在该文件! 请重新输入 && goto input)
echo %regf% | find /i ".reg" >nul
if errorlevel==1 (echo                                           ... 该文件不是注册表文件! 请重新输入 && goto input)

echo.
echo 请稍候,正在转换 ...
set regb=%regf:~0,-4%
echo @echo off>%regb%.bat
echo echo.>>%regb%.bat
echo echo 程序运行中 ...>>%regb%.bat
echo if exist %%temp%%\tmp.reg del /f /q %%temp%%\tmp.reg>>%regb%.bat
for /f "tokens=*" %%a in ('type %regf%') do echo echo %%a^>^>%%temp%%\tmp.reg>>%regb%.bat
echo regedit /s %%temp%%\tmp.reg>>%regb%.bat
echo del /f /q %%temp%%\tmp.reg>>%regb%.bat
echo                                           ... 转换完成! 按任意键退出
pause>nul
回复

使用道具 举报

5#
发表于 2007-6-23 12:34:06 | 只看该作者
这个用了好长时间了,没出过错。
回复

使用道具 举报

6#
 楼主| 发表于 2007-6-25 22:16:01 | 只看该作者

回复 #5 yinyuan 的帖子

先收藏明天再试:D
回复

使用道具 举报

7#
发表于 2009-11-26 11:53:44 | 只看该作者
沙子没有继续吧了.....
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-2-27 15:17

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表