Board logo

标题: [问题求助] [已解决]VBS怎样处理 unicode 格式文件? [打印本页]

作者: yuanyannian    时间: 2014-8-1 06:45     标题: [已解决]VBS怎样处理 unicode 格式文件?

本帖最后由 yuanyannian 于 2014-8-5 19:52 编辑

处理 windows 安装盘中 HIVEDEF.INF 等 unicode 格式文件,得到 apang 老师的很大帮助,但由于本人对批处理实在是外行,每一步都不会写,所以不断麻烦并请教各位老师,请原谅!
现在的问题是,我想按如下方式处理 HIVEDEF.INF 等 unicode 格式文件,需要老师帮忙:
  1. '命令提示符下 输入的格式如 zzz.vbs -Saaa -TD:\zzz
  2. '如参数为 aaa,则跳转到 Function  aaa();如参数为 bbb,则跳转到 Function  bbb();如参数为 ccc,则跳转到 Function  ccc();等等。
  3. '源文件为 unicode,需要保持原格式不变
  4. '如何接收第二个外部参数(变量),并截取 -T后面输入的路径作为变量(如 D:\zzz),后面将调用这个变量作为源文件的路径如 %zzz%
  5. '如下格式执行不正确,如何修改?
  6. Set oArgs = WScript.Arguments
  7. If oArgs(0)="aaa" Then
  8.   Call aaaSE()
  9. ElseIf oArgs(0)="bbb" Then
  10.   Call bbbSE()
  11. ElseIf oArgs(0)="ccc" Then
  12.   Call cccSE()
  13. End If
  14. '退出
  15. Function  aaa()
  16.   Set fso = CreateObject("Scripting.FileSystemObject")
  17.   Set f = fso.OpenTextFile("HIVEDEF.INF", 1, false, -1)  '其中的 HIVEDEF.INF,改为 %xxx%\HIVEDEF.INF
  18.   s = f.ReadAll : f.Close
  19.   s = Replace(f.ReadAll, "HKCU,""", "HKLM,""WB-default\")
  20.   s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  21.   fso.OpenTextFile("HIVEDEF.INF", 2, true, -1).Write s
  22. '安装 %xxx%\HIVEDEF.INF
  23. End Function
  24. '退出
  25. Function  bbb()
  26.   Set fso = CreateObject("Scripting.FileSystemObject")
  27.   Set f = fso.OpenTextFile("HIVESFT.INF", 1, false, -1)  '其中的 HIVESFT.INF,改为 %xxx%\HIVESFT.INF
  28.   s = f.ReadAll : f.Close
  29.   s = Replace(f.ReadAll, "HKLM,""SOFTWARE\", "HKLM,""WB-software\")
  30.   s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  31.   fso.OpenTextFile("HIVESFT.INF", 2, true, -1).Write s
  32. '安装 %xxx%\HIVESFT.INF
  33. End Function
  34. '退出
  35. Function  ccc()
  36.   Set fso = CreateObject("Scripting.FileSystemObject")
  37.   Set f = fso.OpenTextFile("HIVESYS.INF", 1, false, -1)  '其中的 HIVESYS.INF,改为 %xxx%\HIVESYS.INF
  38.   s = f.ReadAll : f.Close
  39.   s = Replace(f.ReadAll, "HKLM,""SYSTEM\", "HKLM,""WB-setup\")
  40.   s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  41.   fso.OpenTextFile("HIVESYS.INF", 2, true, -1).Write s
  42. '安装 %xxx%\HIVESYS.INF
  43. End Function
  44. '退出
复制代码
...
作者: yuanyannian    时间: 2014-8-1 19:17

期待老师出手相助,感谢了!
作者: yuanyannian    时间: 2014-8-1 19:40

本帖最后由 yuanyannian 于 2014-8-1 19:41 编辑

这电脑慢的害人。
作者: apang    时间: 2014-8-1 20:10

试试
  1. msg = "命令提示符下 输入的格式如 zzz.vbs -Saaa -TD:\zzz"
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set oArgs = WScript.Arguments
  4. If oArgs.Count >= 2 Then
  5.     fd = Mid(oArgs(1), 3) & "\"
  6. ElseIf oArgs.Count = 1 Then
  7.     fd = ".\"
  8. Else
  9.     MsgBox msg, , "提示" : WScript.Quit
  10. End If
  11. If Mid(oArgs(0), 3) = "aaa" Then
  12.     Call ReplaceStr("HKCU,""", "HKLM,""WB-default\")
  13. ElseIf Mid(oArgs(0), 3) = "bbb" Then
  14.     Call ReplaceStr("HKLM,""SOFTWARE\", "HKLM,""WB-software\")
  15. ElseIf Mid(oArgs(0), 3) = "ccc" Then
  16.     Call ReplaceStr("HKLM,""SYSTEM\", "HKLM,""WB-setup\")
  17. Else
  18.     MsgBox msg, , "提示" : WScript.Quit
  19. End If
  20. Function ReplaceStr(s1, s2)
  21.     Set f = fso.OpenTextFile(fd & "HIVEDEF.INF", 1, false, -1)
  22.     s = f.ReadAll : f.Close
  23.     s = Replace(s, s1, s2)
  24.     s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  25.     fso.OpenTextFile(fd & "HIVEDEF.INF", 2, true, -1).Write s
  26. End Function
复制代码

作者: yuanyannian    时间: 2014-8-1 22:05

回复 4# apang

首先感谢。

路径截取、调用没问题,HIVEDEF.INF 中的字符可成功替换,但其它两个文本(HIVESFT.INF、HIVESYS.INF 未能执行替换),
看代码中似乎没有针对 HIVESFT.INF、HIVESYS.INF 文件和路径?
再者,需要处理的可能还有更多的文件(同样格式)。

apang 老师辛苦了。
作者: yuanyannian    时间: 2014-8-2 07:09

回复 4# apang


我把代码改为如下:
  1. msg = "命令提示符下 输入的格式如 zzz.vbs -Saaa -TD:\zzz"
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set oArgs = WScript.Arguments
  4. If oArgs.Count >= 2 Then
  5.     fd = Mid(oArgs(1), 3) & "\"
  6. ElseIf oArgs.Count = 1 Then
  7.     fd = ".\"
  8. Else
  9.     MsgBox msg, , "提示" : WScript.Quit
  10. End If
  11. If Mid(oArgs(0), 3) = "aaa" Then
  12.     Call ReplaceDEF()
  13. ElseIf Mid(oArgs(0), 3) = "bbb" Then
  14.     Call ReplaceSFT()
  15. ElseIf Mid(oArgs(0), 3) = "ccc" Then
  16.     Call ReplaceSYS()
  17. Else
  18.     MsgBox msg, , "提示" : WScript.Quit
  19. End If
  20. Function ReplaceDEF()
  21.   Set f = fso.OpenTextFile(fd & "HIVEDEF.INF", 1, false, -1)
  22.   s = Replace(f.ReadAll, "HKCU,""", "HKLM,""WB-default\")
  23.   s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  24.   fso.OpenTextFile(fd & "HIVEDEF.INF", 2, true, -1).Write s
  25.   f.Close
  26. End Function
  27. Function ReplaceSFT()
  28.   Set f = fso.OpenTextFile(fd & "HIVESFT.INF", 1, false, -1)
  29.   s = Replace(f.ReadAll, "HKLM,""SOFTWARE\", "HKLM,""WB-software\")
  30.   s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  31.   fso.OpenTextFile(fd & "HIVESFT.INF", 2, true, -1).Write s
  32.   f.Close
  33. End Function
  34. Function ReplaceSYS()
  35.   Set f = fso.OpenTextFile(fd & "HIVESYS.INF", 1, false, -1)
  36.   s = Replace(f.ReadAll, "HKLM,""SYSTEM\", "HKLM,""WB-setup\")
  37.   s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  38.   fso.OpenTextFile(fd & "HIVESYS.INF", 2, true, -1).Write s
  39.   f.Close
  40. End Function
复制代码
可以达到要求---aaa 时处理 HIVEDEF.INF,bbb 时处理 HIVESFT.INF,ccc 时处理 HIVESYS.INF,但问题来了:它区分大小写,也就是只能处理替换大写字符,请教如何让它不分大小写?
另外,可否处理完以后,运行安装如 HIVEDEF.INF?
bat 下安装 .inf 命令是 rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128(或132) D:\inf\default.inf,vbs 中如何做?
作者: apang    时间: 2014-8-2 15:26

回复 6# yuanyannian


举例:
  1. Function ReplaceSFT()
  2.   Set ws = CreateObject("WScript.Shell")
  3.   Set f = fso.OpenTextFile(fd & "HIVESFT.INF", 1, false, -1)
  4.   s = f.ReadAll : f.Close
  5.   Set re = New RegExp
  6.   re.Pattern = "HKLM,""SOFTWARE\\"
  7.   re.Global = true
  8.   re.IgnoreCase = true
  9.   s = re.Replace(s, "HKLM,""WB-default\")
  10.   s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  11.   fso.OpenTextFile(fd & "HIVESFT.INF", 2, true, -1).Write s
  12.   ''ws.Run "rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 """ & fd & "HIVESFT.INF""", , true
  13. End Function
复制代码

作者: yuanyannian    时间: 2014-8-2 19:45

回复 7# apang

好用,谢谢 apang 老师!

不过,如果需要替换两个以上不同的字符串,不分大小写就不行了。
另外,INF 安装总是失败。
作者: yuanyannian    时间: 2014-8-2 20:02

回复 7# apang

再请教 apang 老师,在您的指导帮助下,基本完成了成品的 vbs,用于处理 unicode 格式文件。主要作用:

1. 运行方式:xxx.vbs -Szzzz.inf -Td:\zzz
2. 如 zzzz.inf 为 ANSI 格式,就转换为 unicode 格式
3. 替换其中的注册表项指向为可挂载的非本系统的注册表文件
4. 安装 inf 文件(实际作用是将 INF 中的内容注入到非本系统的注册表文件)

存在的问题:
1. 代码过于凌乱,也可能有错误的地方,想请老师修改简化一些。
2. 如需要有两处以上替换的,希望均设置成不分大小写。
作者: apang    时间: 2014-8-3 10:29

本帖最后由 apang 于 2014-8-9 23:16 编辑
  1. Dim msg, ws, oArgs, fd
  2. msg = "Command prompt: HoJoHE.vbs -SHIVEDEF.INF -TD:\zzz"
  3. msg = msg & vbLf & "or: HoJoHE.vbs -SHIVEDEF.INF -T""D:\zz z"""
  4. Set ws = CreateObject("WScript.Shell")
  5. Set oArgs = WScript.Arguments
  6. If oArgs.Count >= 2 Then
  7.     fd = Mid(oArgs(1), 3) & "\"
  8. ElseIf oArgs.Count = 1 Then
  9.     fd = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
  10. Else Call HoJoHlp()
  11. End If
  12. Dim file, fso, f, s
  13. Set fso = CreateObject("Scripting.FileSystemObject")
  14. If Not fso.FileExists(fd & Mid(oArgs(0), 3)) Then
  15.     msg = "Input Path or File Name Error" & vbLf & msg
  16.     Call HoJoHlp()
  17. End If
  18. file = fso.GetFile(fd & Mid(oArgs(0), 3)).ShortPath
  19. Set f = fso.OpenTextFile(file, 1, false, GetFileFormat(file))
  20. s = f.ReadAll : f.Close
  21. Select Case UCase(Mid(oArgs(0), 3))
  22.     Case "HIVEDEF.INF"
  23.         s = ReplaceStr(s, "HKCU, *""", "HKLM,""WB-default\")
  24.     Case "HIVESFT.INF"
  25.         s = ReplaceStr(s, "HKLM, *""SOFTWARE\\", "HKLM,""WB-software\")
  26.     Case "HIVESYS.INF"
  27.         s = ReplaceStr(s, "HKLM, *""SYSTEM\\", "HKLM,""WB-setup\")
  28.     Case "HIVECLS.INF"
  29.         s = ReplaceStr(s, "HKLM, *""SOFTWARE\\", "HKLM,""WB-software\")
  30.         s = ReplaceStr(s, "HKCR, *""", "HKLM,""WB-software\Classes\")
  31.         s = ReplaceStr(s, "HKCR,\.", "HKLM,WB-software\Classes\.")
  32.     Case Else Call HoJoHlp()
  33. End Select
  34. fso.OpenTextFile(file, 2, true, -1).Write s
  35. ws.Run "rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 " & file, , true
  36. MsgBox "OK"
  37. Function GetFileFormat(ByVal file)
  38.     Dim Bin
  39.     with CreateObject("Adodb.Stream")
  40.         .Type = 1
  41.         .Mode = 3
  42.         .Open
  43.         .Position = 0
  44.         .Loadfromfile file
  45.         Bin = .read(2)
  46.     End with
  47.     If AscB(MidB(Bin,1,1))=&HFF and AscB(MidB(Bin,2,1))=&HFE Then
  48.         GetFileFormat = -1   ''unicode
  49.     Else GetFileFormat = 0   ''ansi
  50.     End If
  51. End Function
  52. Function ReplaceStr(ByVal s, pattern, s1)
  53.     Dim re
  54.     If Left(s, 16) <> "[DEFAULTINSTALL]" Then
  55.         s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & s
  56.     End If
  57.     Set re = New RegExp
  58.     re.Pattern = pattern
  59.     re.Global = true
  60.     re.IgnoreCase = true
  61.     ReplaceStr = re.Replace(s, s1)
  62. End Function
  63. Function HoJoHlp()
  64.     MsgBox msg : WScript.Quit
  65. End Function
复制代码

作者: yuanyannian    时间: 2014-8-3 13:22

回复 10# apang

非常完美,非常感谢 apang 老师,老师辛苦了!!!

谢!谢!谢!
作者: yuanyannian    时间: 2014-8-3 21:12

回复 10# apang

第一部分修改了一下,意思是判断在三个参数、两个参数、一个参数情况下执行的结果,要求准确输入参数,不知可对?
  1. If oArgs.Count = 3 Then
  2.     If Left(oArgs(0),2) = "-S" and (Left(oArgs(1),2) = "-T") and (Left(oArgs(2),2) = "-I") Then
  3.         sd = Mid(oArgs(2), 3) & "\"
  4.         fd = Mid(oArgs(1), 3) & "\"
  5.     Else MsgBox "Input error!"&vbcrlf&vbcrlf&msg : WScript.Quit
  6.     End If
  7. ElseIf oArgs.Count = 2 Then
  8.     If Left(oArgs(0),2) = "-S" and (Left(oArgs(1),2) = "-T") Then
  9.         sd = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
  10.         fd = Mid(oArgs(1), 3) & "\"
  11.     Else MsgBox "Input error!"&vbcrlf&vbcrlf&msg : WScript.Quit
  12.     End If
  13. ElseIf oArgs.Count = 1 Then
  14.     If oArgs(0) = "?" Then
  15.         MsgBox msg
  16.     ElseIf Left(oArgs(0),2) = "-S" Then
  17.         sd = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
  18.         fd = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
  19.     Else MsgBox "Input error!"&vbcrlf&vbcrlf&msg : WScript.Quit
  20.     End If
  21. Else MsgBox "Input error!"&vbcrlf&vbcrlf&msg : WScript.Quit
  22. End If
复制代码

作者: yuanyannian    时间: 2014-8-4 07:03

回复 10# apang


刚才发现 Case 语句不好用,输入序列以外的任意文件,总提示“文件无法打开”,并不显示 msgbox?
作者: apang    时间: 2014-8-9 23:26

回复 12# yuanyannian


    个人认为,代码主要目的是查找与替换字符串,输入参数的判断,会占到代码很大一部分,自己用的话,没必要整得那么麻烦。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2