2011-3-9
- 博客分类:
- 技术杂绘
2011-3-9
2011年03月09日
REG2BAT.VBS 注册表文件转换脚本名称:Reg2Bat.VBS
'功能:REG文件转换为BAT、CMD文件。
' REG命令功能有限,仅支持常用类型。
' (REG_SZ、REG_DWORD、REG_BINARY、
' REG_EXPAND_SZ、REG_MULTI_SZ)
'
'
'---------------------------
'Reg2Bat By Slore
'---------------------------
'命令行参数说明(不区分大小写)
'/?、/h、/help 查看此帮助信息
'/i:RegFileName 指定要转换的注册表文件路径
'/o:BatFileName 指定转换后的批处理文件路径
'可选参数
'/S:Separator REG_MULTI_SZ 数据字符串中用作分隔符的字符
' 仅限一个字符,默认"\0"用作分隔符
'/Q 安静模式,不弹出错误提示
'/NF 转换后REG命令无/F参数
'/NH 忽略注册表文件头检测
'
'例如:
'简易模式:CScript Reg2Bat.vbs [/i:]slore.reg /S:轩 /Q
' 省略批处理文件路径,将输出为注册表文件同名文件。
'经典模式:CScript Reg2Bat.vbs slore.reg slore.bat /S:轩 /Q
' 其中注册表文件路径和批处理文件路径顺序不可调换。
'标准模式:CScript Reg2Bat.vbs /i:slore.reg /o:slore.bat /S:轩 /Q
' 其中/i:、/o:、/S:中的冒号不可省略,顺序可变。
'---------------------------
Const ForReading = 1
Const ForWriting = 2
Const ForAppending = 8
Const blnOverWrite = True
Const adTypeBinary = 1
Const adModeReadWrite = 3
Const ANSI = 0
Const Unicode = - 1
Const REG_SEPARATOR = "\0" '默认分隔符
Const BatHead = "@echo off" '转换后的批处理文件头
Const BatFileExt = "bat" '批处理文件扩展名
Const IgnoreRegHead = False '忽略注册表文件头检测
Dim RegHexType(10)
RegHexType(0) = "REG_NONE":RegHexType(1) = "REG_SZ"
RegHexType(2) = "REG_EXPAND_SZ":RegHexType(3) = "REG_BINARY"
RegHexType(4) = "REG_DWORD":RegHexType(5) = "REG_DWORD_BIG_ENDIAN"
RegHexType(6) = "REG_LINK":RegHexType(7) = "REG_MULTI_SZ"
RegHexType(8) = "REG_RESOURCE_LIST":RegHexType(9) = "REG_FULL_RESOURCE_DESCRIPTOR"
Dim RegSeptr
Dim blnForce,blnSilent
blnForce = True
blnSilent = False
Dim RegFile,BatFile
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
'参数处理
With WSH.Arguments
If .Count 0 Then
If .Named.Exists("?") Then ShowHelp
If .Named.Exists("h") Then ShowHelp
If .Named.Exists("help") Then ShowHelp
If .Named.Exists("i") Then RegFile = .Named.Item("i")
If .Named.Exists("o") Then BatFile = .Named.Item("o")
If .Named.Exists("s") Then RegSeptr = .Named.Item("s")
If .Named.Exists("q") Then blnSilent = True
If .Named.Exists("nf") Then blnForce = False
If .Named.Exists("nh") Then IgnoreRegHead = True
If .Unnamed.Count > 0 Then
RegFile = .Unnamed.Item(0)
If Not objFSO.FileExists(RegFile) Then WSH.Quit
If .Unnamed.Count > 1 Then
BatFile = .Unnamed.Item(1)
Else
BatFile = Left(RegFile,InstrRev(RegFile,".")) & "bat"
End If
End If
End If
End With
If Len(RegSeptr) = 0 Then
RegSeptr = REG_SEPARATOR
Else
RegSeptr = Left(RegSeptr,1)
End If
'选择注册表文件
If RegFile = "" Then
RegFile = OpenFile(".","注册表文件(*.reg)|*.reg")
If RegFile = "" Then WSH.Quit
Else
BatFile = Left(RegFile,InstrRev(RegFile,".")) & BatFileExt
End If
If Not objFSO.FileExists(RegFile) Then WSH.Quit
'选择批处理文件
If BatFile = "" Then BatFile = OpenFile(".","批处理文件(*." & BatFileExt & ")|*." & BatFileExt)
If BatFile = "" Then WSH.Quit
'获取注册表文件编码
Dim FileEncoding
FileEncoding = GetEncoding(RegFile)
If FileEncoding = "ANSI" Then
OpenFormat = ANSI
ElseIf FileEncoding = "Unicode" Then
OpenFormat = Unicode
Else
If Not blnSilent Then MsgBox "注册表文件的编码不正确。",vbInformation,"文件编码:" & FileEncoding
WSH.Quit
End If
'格式化注册表文件
Dim RegStr,RegLine
Set objFile = objFSO.OpenTextFile(RegFile,ForReading,False,OpenFormat)
Do Until objFile.AtEndOfStream
RegLine = MyTrim(objFile.ReadLine)
If RegLine "" Then '清除空行
'If Left(RegLine,1) ";" Then RegStr = RegStr & RegLine & vbCrLf '清除注释行
RegStr = RegStr & RegLine & vbCrLf
End If
Loop
objFile.Close
'合并hex(?)类型多行数据
Dim hStr,hPos,RegChar
hPos = InStr(1,RegStr,",\" & vbCrLf)
Do While hPos > 0
RegChar = Mid(RegStr,hPos + 4,1)
If InStr(1,"[@""",RegChar) > 0 Then
RegStr = Left(RegStr,hPos - 1) & Mid(RegStr,hPos + 2)
ElseIf RegChar = ";" Then
RemEnd = InStr(hPos + 5,RegStr,vbCrLf)
If RemEnd = 0 Then
RegStr = Left(RegStr,hPos - 1)
Else
RegStr = Left(RegStr,hPos) & Mid(RegStr,RemEnd + 2)
End If
Else
RegStr = Left(RegStr,hPos) & Mid(RegStr,hPos + 4)
End If
hPos = InStr(hPos + 4,RegStr,",\" & vbCrLf)
Loop
'替换主键为缩写
RegStr = Replace(RegStr,vbCrLf & "[HKEY_LOCAL_MACHINE\",vbCrLf & "[HKLM\")
RegStr = Replace(RegStr,vbCrLf & "[HKEY_CURRENT_USER\",vbCrLf & "[HKCU\")
RegStr = Replace(RegStr,vbCrLf & "[HKEY_CLASSES_ROOT\",vbCrLf & "[HKCR\")
RegStr = Replace(RegStr,vbCrLf & "[HKEY_USER\",vbCrLf & "[HKU\")
RegStr = Replace(RegStr,vbCrLf & "[HKEY_CUREENT_CONFIG\",vbCrLf & "[HKCC\")
RegStr = Replace(RegStr,vbCrLf & "[-HKEY_LOCAL_MACHINE\",vbCrLf & "[-HKLM\")
RegStr = Replace(RegStr,vbCrLf & "[-HKEY_CURRENT_USER\",vbCrLf & "[-HKCU\")
RegStr = Replace(RegStr,vbCrLf & "[-HKEY_CLASSES_ROOT\",vbCrLf & "[-HKCR\")
RegStr = Replace(RegStr,vbCrLf & "[-HKEY_USER\",vbCrLf & "[-HKU\")
RegStr = Replace(RegStr,vbCrLf & "[-HKEY_CUREENT_CONFIG\",vbCrLf & "[-HKCC\")
'对格式化后的注册表文件进行转换
Dim RegLines,n
RegLines = Split(RegStr,vbCrLf)
n = UBound(RegLines)
If Not IgnoreRegHead Then
'检验文件头
If RegLines(0) "REGEDIT4" And _
RegLines(0) "Windows Registry Editor Version 5.00" Then
If Not blnSilent Then MsgBox "不是合法注册表文件头",vbInformation,"错误"
WSH.Quit
End If
End If
Dim RegCommand,BatStr
Dim i,RegKey,RegVal,RegType,RegData
If blnForce Then sForce = " /f" Else sForce = ""
Dim o '为1是删除,为0是添加
Dim vPos
Dim HeadChar,LastHeadChar
LastHeadChar = ""
For i = 1 To n
HeadChar = Left(RegLines(i),1)
If HeadChar = "[" Then
If LastHeadChar = "[" And o = 0 Then '添加项
BatStr = BatStr & RegCommand & RegKey & sForce & vbCrLf
End If
If Mid(RegLines(i),2,1) = "-" Then
RegCommand = "reg delete "
o = 1
Else
RegCommand = "reg add "
o = 0
End If
RegKey = """" & Mid(RegLines(i),2 + o,Len(RegLines(i)) - 2 - o) & """"
If o = 1 Then '删除项
BatStr = BatStr & RegCommand & RegKey & sForce & vbCrLf
RegKey = ""
End If
ElseIf HeadChar = "@" And (Not Len(RegKey)) Then
RegLines(i) = Replace(RegLines(i),"\\",vbNullChar)
RegVal = " /ve "
GetTD Replace(Mid(RegLines(i),3),vbNullChar,"\"),RegType,RegData
If RegData = "-" Then
BatStr = BatStr & "reg delete " & RegKey & " /ve " & sForce & vbCrLf
Else
If RegType "REG_SZ" Then
RegType = " /t " & RegType
Else
RegType = ""
End If
BatStr = BatStr & "reg add " & RegKey & " /ve" & RegType & " /d " & RegData & sForce & vbCrLf
End If
ElseIf HeadChar = """" And (Not Len(RegKey)) Then
RegLines(i) = Replace(RegLines(i),"\\",vbNullChar)
vPos = InStr(2,RegLines(i),"""=")
If vPos > 2 Then
If Mid(RegLines(i),vPos - 1,1) = "\" Then
Do Until Mid(RegLines(i),vPos - 1,1) "\"
vPos = InStr(vPos + 2,RegLines(i),"""=")
If vPos = 0 Then Exit Do
Loop
End If
If vPos 0 Then
RegVal = Replace(Left(RegLines(i),vPos),vbNullChar,"\")
RegVal = RegSpe(RegVal,0)
GetTD Replace(Mid(RegLines(i),vPos + 2),vbNullChar,"\"),RegType,RegData
If RegData = "-" Then
BatStr = BatStr & "reg delete " & RegKey & " /v " & RegVal & sForce & vbCrLf
Else
If RegType "REG_SZ" Then
RegType = " /t " & RegType
Else
RegType = ""
End If
BatStr = BatStr & "reg add " & RegKey & " /v " & RegVal & RegType & " /d " & RegData & sForce & vbCrLf
End If
End If
End If
ElseIf HeadChar = ";" Then '注释内容处理(仅支持纯注释行,并且不在Hex数据中间。)
BatStr = BatStr & "rem " & Mid(RegLines(i),2) & vbCrLf
HeadChar = LastHeadChar
End If
LastHeadChar = HeadChar
Next
'保存为批处理文件
If Len(BatHead) Then BatStr = BatHead & vbCrLf & BatStr
If LCase(Right(BatFile,4)) "." & BatFileExt Then BatFile = BatFile & "." & BatFileExt
Set objFile = objFSO.CreateTextFile(BatFile,blnOverWrite)
objFile.Write BatStr
objFile.Close
Sub ShowHelp()
MsgBox "命令行参数说明(不区分大小写)" & vbCrLf & _
"/?、/h、/help 查看此帮助信息" & vbCrLf & _
"/i:RegFileName 指定要转换的注册表文件路径" & vbCrLf & _
"/o:BatFileName 指定转换后的批处理文件路径" & vbCrLf & _
"可选参数" & vbCrLf & _
"/S:Separator REG_MULTI_SZ 数据字符串中用作分隔符的字符" & vbCrLf & _
" 仅限一个字符,默认""\0""用作分隔符" & vbCrLf & _
"/Q 安静模式,不弹出错误提示" & vbCrLf & _
"/NF 转换后REG命令无/F参数" & vbCrLf & _
"/NH 忽略注册表文件头检测" & vbCrLf & vbCrLf & _
"例如:" & vbCrLf & _
"简易模式:CScript Reg2Bat.vbs [/i:]slore.reg /S:轩 /Q" & vbCrLf & _
" 省略批处理文件路径,将输出为注册表文件同名文件" & vbCrLf & _
"经典模式:CScript Reg2Bat.vbs slore.reg slore.bat /S:轩 /Q" & vbCrLf & _
" 其中注册表文件路径和批处理文件路径顺序不可调换。" & vbCrLf & _
"标准模式:CScript Reg2Bat.vbs /i:slore.reg /o:slore.bat /S:轩 /Q" & vbCrLf & _
" 其中/i:、/o:、/S:中的冒号不可省略,顺序可变。" _
,vbInformation,"Reg2Bat By Slore"
WSH.Quit
End Sub
'---------------------------------自定义函数-------------------------------
'打开文件函数
'参数:初始路径,文件类型过滤器
Function OpenFile(IntDir,Fltr)
Dim objDialog
Set objDialog = CreateObject("UserAccounts.CommonDialog")
objDialog.Filter = Fltr
objDialog.InitialDir = IntDir
intResult = objDialog.ShowOpen
If intResult Then
OpenFile = objDialog.FileName
Else
OpenFile = ""
End If
End Function
'检测文本文件编码
Function GetEncoding(FileName)
Dim objStreamR,HeadBin,HeadBytes(1)
Set objStreamR = CreateObject("Adodb.Stream")
objStreamR.Type = adTypeBinary
objStreamR.Mode = adModeReadWrite
objStreamR.Open
objStreamR.LoadFromFile FileName
HeadBin = objStreamR.Read(2)
objStreamR.Close
HeadBytes(0) = AscB(MidB(HeadBin,1,1))
HeadBytes(1) = AscB(MidB(HeadBin,2,1))
GetEncoding = "ANSI"
If HeadBytes(0) = &HFF And HeadBytes(1) = &HFE Then GetEncoding = "Unicode"
If HeadBytes(0) = &HFE And HeadBytes(1) = &HFF Then GetEncoding = "Unicode Big Endian"
If HeadBytes(0) = &HEF And HeadBytes(1) = &HBB Then GetEncoding = "UTF-8"
End Function
'剔除字符串两边的Tab字符和空格
Function MyTrim(iStr)
Dim sPos,ePos
sPos = 1
For i = 1 To Len(iStr)
If Mid(iStr,i,1) = vbTab or Mid(iStr,i,1) = " " Then
sPos = i + 1
Else
Exit For
End If
Next
ePos = Len(iStr)
For i = Len(iStr) To 1 Step - 1
If Mid(iStr,i,1) = vbTab or Mid(iStr,i,1) = " " Then
ePos = i - 1
Else
Exit For
End If
Next
If (ePos - sPos + 1) Separator
sRet = Left(sRet,Len(sRet) - n)
Loop
End If
RegHexToAscii = RegSpe(sRet,1)
End Function
发表评论
-
Flex加载多个Module时出现“TypeError: Error #1034: 强制转换类型失败”错误
2012-01-20 09:56 969Flex加载多个Module时出现“TypeError: Er ... -
Flex 笔记心得连载中
2012-01-20 09:56 723Flex 笔记心得连载中 2010年08月03日 获取焦 ... -
[tamarin系列之9] 在线的eval
2012-01-20 09:56 584[tamarin系列之9] 在线的eval 2010年06月 ... -
Flash务实主义――Loading
2012-01-20 09:56 533Flash务实主义――Loading ... -
Flex动态加载swc和swf中的class
2012-01-20 09:54 842Flex动态加载swc和swf中的class 2011年05 ... -
VB 刷网站代码
2012-01-19 15:00 588VB 刷网站代码 2011年03 ... -
批处理+VBS脚本实现纯文本代码格式化输出
2012-01-19 15:00 601批处理+VBS脚本实现纯文 ... -
ASP文本文档(txt)相关操作代码
2012-01-19 15:00 691ASP文本文档(txt)相关操作代码 2011年04月22日 ... -
为方便自己看网络小说,自己写个txt按章节分段的小程序
2012-01-19 15:00 920为方便自己看网络小说,自己写个txt按章节分段的小程序 20 ... -
OpenGL开发库的详细介绍
2012-01-17 04:43 518OpenGL开发库的详细介绍 ... -
转载:OpenGL显示文字
2012-01-17 04:43 541转载:OpenGL显示文字 2010年07月03日 本课 ... -
VS2005配置OpenGL
2012-01-17 04:43 1000VS2005配置OpenGL 2011年06月24日 昨 ... -
OpenGL的安装
2012-01-17 04:43 625OpenGL的安装 2010年06月20 ... -
opengl
2012-01-17 04:43 685opengl 2010年11月17日 ... -
C#面试题集锦(你值得拥有!)
2012-01-16 03:37 1106C#面试题集锦(你值得拥 ... -
ASP.Net考试复习资料
2012-01-16 03:37 903ASP.Net考试复习资料 2011 ... -
ASP小偷(三):文档对象模型DOM
2012-01-16 03:37 1094ASP小偷(三):文档对象模型DOM 2009年08月22日 ... -
javascript:history.go()和History.back()的区别
2012-01-16 03:37 781javascript:history.go()和History ... -
经典的串口调试助手源代码(一)
2012-01-16 03:37 647经典的串口调试助手源代码(一) 2011年05月26日 ...
相关推荐
在【LGA2011-0 -1 -3(含所谓oc底座)针脚定义图.xlsx】中定位你要找的针脚,得到编号,字母在前数字在后(列如【CJ17】) 然后打开【查找针脚定义】文件夹,在符合你主板的pdf里使用查找功能即可得到该针脚准确...
3D MAX 2011 注册机xf-a2011-64bits
3、范围:全国31省,337个地级市以及2800个县 4、指标:覆盖广度、使用深度、支付业务、保险业务、货币基金业务、投资业务、信用业务、信贷业务、数字化程度 这套指数包括数字普惠金融指数,以及数字金融覆盖广度、...
3、指标说明: 数字经济主成分、电信业务收入万元、信息传输计算机服务和软件业人、互联网宽带接入用户数万户、移动电话用户数万人 、普惠金融指数 参照赵涛(2020)文章,整理的原始数据,包括2011-2019年280个...
ISO 16000-3-2011中文.pdf
ISO-IEC 14443-3-2011.PDF是2011-04-15公布的,是14443-3第2版。截止2014.05.27, ISO又公布了几个14443-3更新。 ISO/IEC 14443-3:2011/Amd 1:2011, Electromagnetic disturbance handling and single-size unique ...
3、范围:中国内地31个省(直辖市、自治区,简称“省”)、337个地级以上城市(地区、自治州、盟等,简称“城市”),以及约2800个县(县级市、旗、市辖区等,简称“县域”);部分地区数据存在缺失;港澳台地区数据...
CentOS8 镜像
插座指南2011-3 他2011v3 / 2011v3 特别适合Zionotred董事会2ch.hk/hw 编写本指南时,以及和其他来源的。 复制信息时,请确保注明原始来源。 *如果您对本指南有任何建议,请撰写请求请求或创建问题,我们将在...
C/C++11标准英文原版文档 C11标准是 ISO/IEC 9899:2011-Information technology--Programming ...3.ISO/IEC 9899:201x - N1570 - Programming languages - C .Open Standards.2011-04-12[引用日期2014-11-16]
地级市数字经济数据 1、自主整理 2、时间跨度:2011-2019年 3、区域范围:全国 4、指标说明: 整理的原始数据,包括2011-2019年280个地级市的数字经济的数据以及do文档 部分数据如下:
2011-4-28 H3CNE最新题库 DOC的文档,无图,很适合打印
无线电2011-3
LearnSite1.096版2011-9-3信息技术平台源文件 信息技术教学专用平台
2、时间跨度:2011-2020 3、区域范围:约含有一千多家公司 4、指标说明: 彭博企业社会责任披露指数(Bloomberg ESG Disclo-sure Scores),包括ESG综合得分以及环境、社会、治理分项得分 部分数据如下:
firefox4.0国际版(2011-3-22)
linux精通必学2011-01-11.part3linux精通必学2011-01-11.part3
南极是一家国内知名的游戏外设厂商,为广大游戏玩家量身定做了一系列的优秀游戏外设。 近期南极放出新驱动以支持Win7 64位系统,广大的南极手柄爱好者终于可以在Win7 64位下尽情游戏了。...如需此3款的驱动请下载B版。
j2ee面试题2011-3收集.docx j2ee面试题2011-3收集.docx
财务与金融国际班培养计划-2011-3-1.doc