`
liq39liq
  • 浏览: 14802 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics