无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 4139|回复: 5
打印 上一主题 下一主题

[分享] reg2batcmd---vbs版本

[复制链接]
跳转到指定楼层
1#
发表于 2011-2-12 21:05:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. '------------------------------------------------------------------------------
  2. '名称:Reg2Bat.VBS
  3. '功能:REG文件转换为BAT、CMD文件。
  4. '     REG命令功能有限,仅支持常用类型。
  5. '      (REG_SZ、REG_DWORD、REG_BINARY、
  6. '         REG_EXPAND_SZ、REG_MULTI_SZ)
  7. '
  8. '                                   By Slore
  9. '                             更新于:2009-12-06
  10. '
  11. '如果对脚本有任何意见和建议,可发送相关信息至:
  12. '                              slorelee@yahoo.com.cn
  13. '---------------------------
  14. 'Reg2Bat By Slore
  15. '---------------------------
  16. '命令行参数说明(不区分大小写)
  17. '/?、/h、/help  查看此帮助信息
  18. '/i:RegFileName 指定要转换的注册表文件路径
  19. '/o:BatFileName 指定转换后的批处理文件路径
  20. '可选参数
  21. '/S:Separator   REG_MULTI_SZ 数据字符串中用作分隔符的字符
  22. '               仅限一个字符,默认"\0"用作分隔符
  23. '/Q             安静模式,不弹出错误提示
  24. '/NF            转换后REG命令无/F参数
  25. '/NH            忽略注册表文件头检测
  26. '
  27. '例如:
  28. '简易模式:CScript Reg2Bat.vbs [/i:]slore.reg /S:轩 /Q
  29. '         省略批处理文件路径,将输出为注册表文件同名文件。
  30. '经典模式:CScript Reg2Bat.vbs slore.reg slore.bat /S:轩 /Q
  31. '         其中注册表文件路径和批处理文件路径顺序不可调换。
  32. '标准模式:CScript Reg2Bat.vbs /i:slore.reg /o:slore.bat /S:轩 /Q
  33. '         其中/i:、/o:、/S:中的冒号不可省略,顺序可变。
  34. '---------------------------
  35. Const ForReading = 1
  36. Const ForWriting = 2
  37. Const ForAppending = 8
  38. Const blnOverWrite = True
  39. Const adTypeBinary = 1
  40. Const adModeReadWrite = 3
  41. Const ANSI = 0
  42. Const Unicode = - 1
  43. Const REG_SEPARATOR = "\0"       '默认分隔符
  44. Const BatHead = "@echo off"      '转换后的批处理文件头
  45. Const BatFileExt = "bat"         '批处理文件扩展名
  46. Const IgnoreRegHead = False      '忽略注册表文件头检测
  47. Dim RegHexType(10)
  48. RegHexType(0) = "REG_NONE":RegHexType(1) = "REG_SZ"
  49. RegHexType(2) = "REG_EXPAND_SZ":RegHexType(3) = "REG_BINARY"
  50. RegHexType(4) = "REG_DWORD":RegHexType(5) = "REG_DWORD_BIG_ENDIAN"
  51. RegHexType(6) = "REG_LINK":RegHexType(7) = "REG_MULTI_SZ"
  52. RegHexType(8) = "REG_RESOURCE_LIST":RegHexType(9) = "REG_FULL_RESOURCE_DESCRIPTOR"
  53. Dim RegSeptr
  54. Dim blnForce,blnSilent
  55. blnForce = True
  56. blnSilent = False
  57. Dim RegFile,BatFile
  58. Dim objFSO
  59. Set objFSO = CreateObject("Scripting.FileSystemObject")
  60. '参数处理
  61. With WSH.Arguments
  62.     If .Count <> 0 Then
  63.         If .Named.Exists("?") Then ShowHelp
  64.         If .Named.Exists("h") Then ShowHelp
  65.         If .Named.Exists("help") Then ShowHelp
  66.         If .Named.Exists("i") Then RegFile = .Named.Item("i")
  67.         If .Named.Exists("o") Then BatFile = .Named.Item("o")
  68.         If .Named.Exists("s") Then RegSeptr = .Named.Item("s")
  69.         If .Named.Exists("q") Then blnSilent = True
  70.         If .Named.Exists("nf") Then blnForce = False
  71.         If .Named.Exists("nh") Then IgnoreRegHead = True
  72.         If .Unnamed.Count > 0 Then
  73.             RegFile = .Unnamed.Item(0)
  74.             If Not objFSO.FileExists(RegFile) Then WSH.Quit
  75.             If .Unnamed.Count > 1 Then
  76.                 BatFile = .Unnamed.Item(1)
  77.             Else
  78.                 BatFile = Left(RegFile,InstrRev(RegFile,".")) & "bat"
  79.             End If
  80.         End If
  81.     End If
  82. End With
  83. If Len(RegSeptr) = 0 Then
  84.     RegSeptr = REG_SEPARATOR
  85. Else
  86.     RegSeptr = Left(RegSeptr,1)
  87. End If
  88. '选择注册表文件
  89. If RegFile = "" Then
  90.     RegFile = OpenFile(".","注册表文件(*.reg)|*.reg")
  91.     If RegFile = "" Then WSH.Quit
  92. Else
  93.     BatFile = Left(RegFile,InstrRev(RegFile,".")) & BatFileExt
  94. End If
  95. If Not objFSO.FileExists(RegFile) Then WSH.Quit
  96. '选择批处理文件
  97. If BatFile = "" Then BatFile = OpenFile(".","批处理文件(*." & BatFileExt & ")|*." & BatFileExt)
  98. If BatFile = "" Then WSH.Quit
  99. '获取注册表文件编码
  100. Dim FileEncoding
  101. FileEncoding = GetEncoding(RegFile)
  102. If FileEncoding = "ANSI" Then
  103.     OpenFormat = ANSI
  104. ElseIf FileEncoding = "Unicode" Then
  105.     OpenFormat = Unicode
  106. Else
  107.     If Not blnSilent Then MsgBox "注册表文件的编码不正确。",vbInformation,"文件编码:" & FileEncoding
  108.     WSH.Quit
  109. End If
  110. '格式化注册表文件
  111. Dim RegStr,RegLine
  112. Set objFile = objFSO.OpenTextFile(RegFile,ForReading,False,OpenFormat)
  113. Do Until objFile.AtEndOfStream
  114.     RegLine = MyTrim(objFile.ReadLine)
  115.     If RegLine <> "" Then '清除空行
  116.         'If Left(RegLine,1) <> ";" Then RegStr = RegStr & RegLine & vbCrLf '清除注释行
  117.         RegStr = RegStr & RegLine & vbCrLf
  118.     End If
  119. Loop
  120. objFile.Close
  121. '合并hex(?)类型多行数据
  122. Dim hStr,hPos,RegChar
  123. hPos = InStr(1,RegStr,"," & vbCrLf)
  124. Do While hPos > 0
  125.     RegChar = Mid(RegStr,hPos + 4,1)
  126.     If InStr(1,"[@""",RegChar) > 0 Then
  127.         RegStr = Left(RegStr,hPos - 1) & Mid(RegStr,hPos + 2)
  128.     ElseIf RegChar = ";" Then
  129.         RemEnd = InStr(hPos + 5,RegStr,vbCrLf)
  130.         If RemEnd = 0 Then
  131.             RegStr = Left(RegStr,hPos - 1)
  132.         Else
  133.             RegStr = Left(RegStr,hPos) & Mid(RegStr,RemEnd + 2)
  134.         End If
  135.     Else
  136.         RegStr = Left(RegStr,hPos) & Mid(RegStr,hPos + 4)
  137.     End If
  138.     hPos = InStr(hPos + 4,RegStr,"," & vbCrLf)
  139. Loop
  140. '替换主键为缩写
  141. RegStr = Replace(RegStr,vbCrLf & "[HKEY_LOCAL_MACHINE",vbCrLf & "[HKLM")
  142. RegStr = Replace(RegStr,vbCrLf & "[HKEY_CURRENT_USER",vbCrLf & "[HKCU")
  143. RegStr = Replace(RegStr,vbCrLf & "[HKEY_CLASSES_ROOT",vbCrLf & "[HKCR")
  144. RegStr = Replace(RegStr,vbCrLf & "[HKEY_USER",vbCrLf & "[HKU")
  145. RegStr = Replace(RegStr,vbCrLf & "[HKEY_CUREENT_CONFIG",vbCrLf & "[HKCC")
  146. RegStr = Replace(RegStr,vbCrLf & "[-HKEY_LOCAL_MACHINE",vbCrLf & "[-HKLM")
  147. RegStr = Replace(RegStr,vbCrLf & "[-HKEY_CURRENT_USER",vbCrLf & "[-HKCU")
  148. RegStr = Replace(RegStr,vbCrLf & "[-HKEY_CLASSES_ROOT",vbCrLf & "[-HKCR")
  149. RegStr = Replace(RegStr,vbCrLf & "[-HKEY_USER",vbCrLf & "[-HKU")
  150. RegStr = Replace(RegStr,vbCrLf & "[-HKEY_CUREENT_CONFIG",vbCrLf & "[-HKCC")
  151. '对格式化后的注册表文件进行转换
  152. Dim RegLines,n
  153. RegLines = Split(RegStr,vbCrLf)
  154. n = UBound(RegLines)
  155. If Not IgnoreRegHead Then
  156. '检验文件头
  157.     If RegLines(0) <> "REGEDIT4" And _
  158.         RegLines(0) <> "Windows Registry Editor Version 5.00" Then
  159.         If Not blnSilent Then MsgBox "不是合法注册表文件头",vbInformation,"错误"
  160.         WSH.Quit
  161.     End If
  162. End If
  163. Dim RegCommand,BatStr
  164. Dim i,RegKey,RegVal,RegType,RegData
  165. If blnForce Then sForce = " /f" Else sForce = ""
  166. Dim o '为1是删除,为0是添加
  167. Dim vPos
  168. Dim HeadChar,LastHeadChar
  169. LastHeadChar = ""
  170. For i = 1 To n
  171.     HeadChar = Left(RegLines(i),1)
  172.     If HeadChar = "[" Then
  173.         If LastHeadChar = "[" And o = 0 Then '添加项
  174.             BatStr = BatStr & RegCommand & RegKey & sForce & vbCrLf
  175.         End If
  176.         If Mid(RegLines(i),2,1) = "-" Then
  177.             RegCommand = "reg delete "
  178.             o = 1
  179.         Else
  180.             RegCommand = "reg add "
  181.             o = 0
  182.         End If
  183.         RegKey = """" & Mid(RegLines(i),2 + o,Len(RegLines(i)) - 2 - o) & """"
  184.         If o = 1 Then '删除项
  185.             BatStr = BatStr & RegCommand & RegKey & sForce & vbCrLf
  186.             RegKey = ""
  187.         End If
  188.     ElseIf HeadChar = "@" And (Not Len(RegKey)) Then
  189.         RegLines(i) = Replace(RegLines(i),"\",vbNullChar)
  190.         RegVal = " /ve "
  191.         GetTD Replace(Mid(RegLines(i),3),vbNullChar,""),RegType,RegData
  192.         If RegData = "-" Then
  193.             BatStr = BatStr & "reg delete " & RegKey & " /ve " & sForce & vbCrLf
  194.         Else
  195.             If RegType <> "REG_SZ" Then
  196.                 RegType = " /t " & RegType
  197.             Else
  198.                 RegType = ""
  199.             End If
  200.             BatStr = BatStr & "reg add " & RegKey & " /ve" & RegType & " /d " & RegData & sForce & vbCrLf
  201.         End If
  202.     ElseIf HeadChar = """" And (Not Len(RegKey)) Then
  203.         RegLines(i) = Replace(RegLines(i),"\",vbNullChar)
  204.         vPos = InStr(2,RegLines(i),"""=")
  205.         If vPos > 2 Then
  206.             If Mid(RegLines(i),vPos - 1,1) = "" Then
  207.                 Do Until Mid(RegLines(i),vPos - 1,1) <> ""
  208.                     vPos = InStr(vPos + 2,RegLines(i),"""=")
  209.                     If vPos = 0 Then Exit Do
  210.                 Loop
  211.             End If
  212.             If vPos <> 0 Then
  213.                 RegVal = Replace(Left(RegLines(i),vPos),vbNullChar,"")
  214.                 RegVal = RegSpe(RegVal,0)
  215.                 GetTD Replace(Mid(RegLines(i),vPos + 2),vbNullChar,""),RegType,RegData
  216.                 If RegData = "-" Then
  217.                     BatStr = BatStr & "reg delete " & RegKey & " /v " & RegVal & sForce & vbCrLf
  218.                 Else
  219.                     If RegType <> "REG_SZ" Then
  220.                         RegType = " /t " & RegType
  221.                     Else
  222.                         RegType = ""
  223.                     End If
  224.                     BatStr = BatStr & "reg add " & RegKey & " /v " & RegVal & RegType & " /d " & RegData & sForce & vbCrLf
  225.                 End If
  226.             End If
  227.         End If
  228.     ElseIf HeadChar = ";" Then  '注释内容处理(仅支持纯注释行,并且不在Hex数据中间。)
  229.         BatStr = BatStr & "rem " & Mid(RegLines(i),2) & vbCrLf
  230.         HeadChar = LastHeadChar
  231.     End If
  232.     LastHeadChar = HeadChar
  233. Next
  234. '保存为批处理文件
  235. If Len(BatHead) Then BatStr = BatHead & vbCrLf & BatStr
  236. If LCase(Right(BatFile,4)) <> "." & BatFileExt Then BatFile = BatFile & "." & BatFileExt
  237. Set objFile = objFSO.CreateTextFile(BatFile,blnOverWrite)
  238. objFile.Write BatStr
  239. objFile.Close
  240. Sub ShowHelp()
  241.     MsgBox "命令行参数说明(不区分大小写)" & vbCrLf & _
  242.             "/?、/h、/help  查看此帮助信息" & vbCrLf & _
  243.              "/i:RegFileName 指定要转换的注册表文件路径" & vbCrLf & _
  244.               "/o:BatFileName 指定转换后的批处理文件路径" & vbCrLf & _
  245.                "可选参数" & vbCrLf & _
  246.                 "/S:Separator   REG_MULTI_SZ 数据字符串中用作分隔符的字符" & vbCrLf & _
  247.                  "               仅限一个字符,默认""\0""用作分隔符" & vbCrLf & _
  248.                   "/Q             安静模式,不弹出错误提示" & vbCrLf & _
  249.                    "/NF            转换后REG命令无/F参数" & vbCrLf & _
  250.                     "/NH            忽略注册表文件头检测" & vbCrLf & vbCrLf & _
  251.                      "例如:" & vbCrLf & _
  252.                       "简易模式:CScript Reg2Bat.vbs [/i:]slore.reg /S:轩 /Q" & vbCrLf & _
  253.                        "         省略批处理文件路径,将输出为注册表文件同名文件" & vbCrLf & _
  254.                         "经典模式:CScript Reg2Bat.vbs slore.reg slore.bat /S:轩 /Q" & vbCrLf & _
  255.                          "         其中注册表文件路径和批处理文件路径顺序不可调换。" & vbCrLf & _
  256.                           "标准模式:CScript Reg2Bat.vbs /i:slore.reg /o:slore.bat /S:轩 /Q" & vbCrLf & _
  257.                            "         其中/i:、/o:、/S:中的冒号不可省略,顺序可变。" _
  258.                             ,vbInformation,"Reg2Bat By Slore"
  259.     WSH.Quit
  260. End Sub
  261. '---------------------------------自定义函数-------------------------------
  262. '打开文件函数
  263. '参数:初始路径,文件类型过滤器
  264. Function OpenFile(IntDir,Fltr)
  265.     Dim objDialog
  266.     Set objDialog = CreateObject("UserAccounts.CommonDialog")
  267.     objDialog.Filter = Fltr
  268.     objDialog.InitialDir = IntDir
  269.     intResult = objDialog.ShowOpen
  270.     If intResult Then
  271.         OpenFile = objDialog.FileName
  272.     Else
  273.         OpenFile = ""
  274.     End If
  275. End Function
  276. '检测文本文件编码
  277. Function GetEncoding(FileName)
  278.     Dim objStreamR,HeadBin,HeadBytes(1)
  279.     Set objStreamR = CreateObject("Adodb.Stream")
  280.     objStreamR.Type = adTypeBinary
  281.     objStreamR.Mode = adModeReadWrite
  282.     objStreamR.Open
  283.     objStreamR.LoadFromFile FileName
  284.     HeadBin = objStreamR.Read(2)
  285.     objStreamR.Close
  286.     HeadBytes(0) = AscB(MidB(HeadBin,1,1))
  287.     HeadBytes(1) = AscB(MidB(HeadBin,2,1))
  288.     GetEncoding = "ANSI"
  289.     If HeadBytes(0) = &HFF And HeadBytes(1) = &HFE Then GetEncoding = "Unicode"
  290.     If HeadBytes(0) = &HFE And HeadBytes(1) = &HFF Then GetEncoding = "Unicode Big Endian"
  291.     If HeadBytes(0) = &HEF And HeadBytes(1) = &HBB Then GetEncoding = "UTF-8"
  292. End Function
  293. '剔除字符串两边的Tab字符和空格
  294. Function MyTrim(iStr)
  295.     Dim sPos,ePos
  296.     sPos = 1
  297.     For i = 1 To Len(iStr)
  298.         If Mid(iStr,i,1) = vbTab or Mid(iStr,i,1) = " " Then
  299.             sPos = i + 1
  300.         Else
  301.             Exit For
  302.         End If
  303.     Next
  304.     ePos = Len(iStr)
  305.     For i = Len(iStr) To 1 Step - 1
  306.         If Mid(iStr,i,1) = vbTab or Mid(iStr,i,1) = " " Then
  307.             ePos = i - 1
  308.         Else
  309.             Exit For
  310.         End If
  311.     Next
  312.     If (ePos - sPos + 1) < 0 Then
  313.         MyTrim = ""
  314.         Exit Function
  315.     End If
  316.     MyTrim = Mid(iStr,sPos,ePos - sPos + 1)
  317. End Function
  318. Sub GetTD(iStr,oType,oData)
  319.     Dim i
  320.     oType = "":oData = ""
  321.     If iStr = "" Then  Exit Sub
  322.     If iStr = "-" Then oData = "-":Exit Sub
  323.     If Left(iStr,1) = """" Then
  324.         oType = "REG_SZ"
  325.         oData = RegSpe(iStr,0)
  326.     ElseIf LCase(Left(iStr,4)) = "hex:" Then
  327.         oType = "REG_BINARY"
  328.         oData = """" & Replace(Mid(iStr,5),",","") & """"
  329.     ElseIf LCase(Left(iStr,6)) = "dword:" Then
  330.         oType = "REG_DWORD"
  331.         oData = Hex2Dec(Mid(iStr,7))
  332.     Else
  333.         For i = 0 To 9
  334.             If LCase(Left(iStr,7)) = "hex(" & i & "):" Then
  335.                 oType = RegHexType(i)
  336.                 If (i = 1) or (i = 2) or (i = 3) or (i = 7) Then
  337.                     oData = RegHexToAscii(Replace(Mid(iStr,8),",",""),i,RegSeptr)
  338.                 Else
  339.                     oData = """对不起,这是不支持的类型。"""
  340.                 End If
  341.                 Exit For
  342.             End If
  343.         Next
  344.     End If
  345. End Sub
  346. Function RegSpe(iStr,t)
  347.     Dim i,f,QPos
  348.     If Left(iStr,1) = """" Then
  349.         RegSpe = Mid(iStr,2,Len(iStr) - 2) '去除双引号
  350.     Else
  351.         RegSpe = iStr
  352.     End If
  353.     '反斜杠与引号字符串处理
  354.     QPos = - 1
  355.     Do Until QPos = 0
  356.         QPos = InstrRev(RegSpe,"""",QPos)
  357.         If QPos = 0 Then Exit Do
  358.         f = t
  359.         For i = QPos To 1 Step - 1
  360.             If Mid(RegSpe,i,1) = "" Then
  361.                 If f = 1 Then
  362.                     RegSpe = Left(RegSpe,i) & "" & Mid(RegSpe,i + 1)
  363.                 Else
  364.                     f = 1
  365.                 End If
  366.             Else
  367.                 Exit For
  368.             End If
  369.         Next
  370.         QPos = i
  371.     Loop
  372.     For i = Len(RegSpe) To 1 Step - 1
  373.         If Mid(RegSpe,i,1) = "" Then
  374.             RegSpe = RegSpe & ""
  375.         Else
  376.             Exit For
  377.         End If
  378.     Next
  379.     '百分号字符处理
  380.     RegSpe = Replace(RegSpe,"%","%%")
  381.     '对HexData转ASCII的引号字符进行转义
  382.     If t = 1 Then
  383.         RegSpe = Replace(RegSpe,"""","""")
  384.     End If
  385.     '添加双引号
  386.     RegSpe = """" & RegSpe & """"
  387. End Function
  388. Function Hex2Dec(strHex)
  389.     Hex2Dec = 268435456 * CLng("&H" & Left(strHex,1))
  390.     Hex2Dec = Hex2Dec + CLng("&H" & Mid(strHex,2))
  391. End Function
  392. Function RegHexToAscii(iStr,RegTypeIndex,Separator)
  393.     Dim i,n,sRet,HexL,HexH
  394.     For i = 1 To Len(iStr) Step 4
  395.         HexL = Mid(iStr, i, 2)
  396.         HexH = Mid(iStr, i + 2, 2)
  397.         If HexL & HexH = "0000" Then
  398.             If RegTypeIndex = 7 Then '多字符串(REG_MULTI_SZ)类型
  399.                 HexChar = Separator
  400.             Else 'ElseIf RegTypeIndex = 2 Then '可扩充字符串(REG_EXPAND_SZ)类型
  401.                 Exit For
  402.             End If
  403.         ElseIf HexL = "00" Then
  404.             HexChar = Chr(CLng("&H" & HexL))
  405.         Else
  406.             HexChar = ChrW(CLng("&H" & HexH & HexL))
  407.         End If
  408.         sRet = sRet & HexChar
  409.     Next
  410.     If RegTypeIndex = 7 Then
  411.         n = Len(Separator)
  412.         Do Until Right(sRet,n) <> Separator
  413.             sRet = Left(sRet,Len(sRet) - n)
  414.         Loop
  415.     End If
  416.     RegHexToAscii = RegSpe(sRet,1)
  417. End Function


复制代码
2#
发表于 2011-2-13 08:42:10 | 只看该作者
楼主你好,试了一下,出现错误,请检查代码。

[ 本帖最后由 whsand 于 2011-2-13 13:00 编辑 ]
回复

使用道具 举报

3#
 楼主| 发表于 2011-2-13 13:52:41 | 只看该作者

回复 #2 whsand 的帖子

你将需要转换的文件直接拉到这个文件名称上面。
回复

使用道具 举报

4#
发表于 2011-2-15 12:32:51 | 只看该作者
不知道是不是最新的。。。cn-dos也打不开了。。。貌似是数据的问题吧。应该得到HEX数据可能传进来的不对。

XP的话是有选择文件对话框的。。。
不带参数也是可以用的。
回复

使用道具 举报

5#
发表于 2011-2-15 15:22:03 | 只看该作者
报错同2楼,好东西我喜欢,不过希望是不出错哦
回复

使用道具 举报

6#
发表于 2011-2-15 20:22:49 | 只看该作者
谢谢,是可以转换的。

[ 本帖最后由 sck 于 2011-2-15 20:32 编辑 ]
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-7 06:38

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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