标题: [文件操作] reg文件转bat的批处理代码咨询 [打印本页]
作者: 愚无尽 时间: 2008-10-5 17:56 标题: reg文件转bat的批处理代码咨询
- @echo off
- color a
- mode con cols=20 lines=3
- 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
- )
- )
- )
复制代码
以上代码和转换软件“reg to bat”得出的结果大不相同。有无缺陷请教。
另是否可以拖动reg文件到cmd窗口然后自动转换?
作者: Batcher 时间: 2008-10-5 18:29
有没有具体的例子来说明“结果大不相同”?
作者: 愚无尽 时间: 2008-10-5 18:42
原帖由 Batcher 于 2008-10-5 18:29 发表
有没有具体的例子来说明“结果大不相同”?
本文代码转换结果:
- reg add "HKCR\lnkfile" /v @ /t REG_SZ /d "快捷方式" /f
- reg add "HKCR\lnkfile" /v "EditFlags" /t REG_DWORD /d 00000001 /f
- reg add "HKCR\lnkfile" /v "NeverShowExt" /t REG_SZ /d "" /f
- reg add "HKCR\lnkfile\CLSID" /v @ /t REG_SZ /d "{00021401-0000-0000-C000-000000000046}" /f
- reg add "HKCR\lnkfile\shellex\ContextMenuHandlers\Offline Files" /v @ /t REG_SZ /d "{750fdf0e-2a26-11d1-a3ea-080036587f03}" /f
- reg add "HKCR\lnkfile\shellex\DropHandler" /v @ /t REG_SZ /d "{00021401-0000-0000-C000-000000000046}" /f
- reg add "HKCR\lnkfile\shellex\IconHandler" /v @ /t REG_SZ /d "{00021401-0000-0000-C000-000000000046}" /f
- reg add "HKCR\lnkfile\shellex\PropertySheetHandlers\ShimLayer Property Page" /v @ /t REG_SZ /d "{513D916F-2A8E-4F51-AEAB-0CBC76FB1AF8}" /f
-
复制代码
软件转换结果如下:
-
- @ECHO OFF
- > "%Temp%.\DefOpen.reg" ECHO Windows Registry Editor Version 5.00
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile]
- >>"%Temp%.\DefOpen.reg" ECHO @="快捷方式"
- >>"%Temp%.\DefOpen.reg" ECHO "EditFlags"=dword:00000001
- >>"%Temp%.\DefOpen.reg" ECHO "NeverShowExt"=""
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\CLSID]
- >>"%Temp%.\DefOpen.reg" ECHO @="{00021401-0000-0000-C000-000000000046}"
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\shell]
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\shellex]
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\shellex\ContextMenuHandlers]
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\shellex\ContextMenuHandlers\Offline Files]
- >>"%Temp%.\DefOpen.reg" ECHO @="{750fdf0e-2a26-11d1-a3ea-080036587f03}"
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\shellex\ContextMenuHandlers\{00021401-0000-0000-C000-000000000046}]
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\shellex\DropHandler]
- >>"%Temp%.\DefOpen.reg" ECHO @="{00021401-0000-0000-C000-000000000046}"
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\shellex\IconHandler]
- >>"%Temp%.\DefOpen.reg" ECHO @="{00021401-0000-0000-C000-000000000046}"
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\shellex\PropertySheetHandlers]
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\shellex\PropertySheetHandlers\ShimLayer Property Page]
- >>"%Temp%.\DefOpen.reg" ECHO @="{513D916F-2A8E-4F51-AEAB-0CBC76FB1AF8}"
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\SuperMenu_Bak1]
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO [HKEY_CLASSES_ROOT\lnkfile\SuperMenu_Bak1\{00021401-0000-0000-C000-000000000046}]
- >>"%Temp%.\DefOpen.reg" ECHO.
- >>"%Temp%.\DefOpen.reg" ECHO.
- START /WAIT REGEDIT /S "%Temp%.\DefOpen.reg"
- DEL "%Temp%.\DefOpen.reg"
复制代码
作者: zqz0012005 时间: 2008-10-5 19:02
楼主大哥是从cn-dos转过来的代码吧?好像cn-dos对代码缺陷讨论过,大哥没找到?我记得也有改进过的代码,我没有收藏
1、默认值问题,注册表中是@,reg命令中应该是/ve
2、百分号%问题,对于注册表中含%1等参数,bat中应该将%转换成%%
作者: 愚无尽 时间: 2008-10-5 19:35
原帖由 zqz0012005 于 2008-10-5 19:02 发表
楼主大哥是从cn-dos转过来的代码吧?好像cn-dos对代码缺陷讨论过,大哥没找到?我记得也有改进过的代码,我没有收藏
1、默认值问题,注册表中是@,reg命令中应该是/ve
2、百分号%问题,对于注册表中含%1等参数,ba ...
不是在cn-dos找到,是在DOS资源站 www.cmdos.net找到。
作者: Batcher 时间: 2008-10-5 19:39
DOS资源站的东西很多都是从CN-DOS直接kiang过去的,只是修改了一下作者信息就据为己有了。
【方案一】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)作处理,因为根本就无法处理.
原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=32748
【方案二】reg2inf.exe
.Reg => .Inf 转换器 Reg2Inf.EXE
这是一个Windows Console程序,可以按照 .Reg 的“注册表项”文件,生成 .Inf 的“安装信息”文件。
由于在一般情况下, .Reg被引入到注册表中时,只能增加新的键,或者修改原有的键,却不能删除已经存在的键。而我们在系统维护中,为了保存一些设置而导出注册表的某个部分,存为 .Reg了,在恢复设置时,我们希望得到的结果,应该是原模原样地恢复,而不是残留一些不知会起什么副作用的垃圾,那么这时候,Reg2Inf就有用了。
This program generates .Inf file from a .Reg file. (by [email]kajaa@eastday.com[/email])
Syntax: Reg2Inf [switches] [ [DestFile.Inf]]
switches:
-w output WHOLE keyname instead of abbreviation
-t output in TINY mode, no comments
官网下载:http://kajaa.bbs.us/
作者: lianji 时间: 2009-4-25 01:59
如果效果相同的话~~
看似bat转换更简洁~~~
不懂的说~~~~
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |