返回列表 发帖

[问题求助] [已解决]VBS怎样处理 unicode 格式文件?

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

处理 windows 安装盘中 HIVEDEF.INF 等 unicode 格式文件,得到 apang 老师的很大帮助,但由于本人对批处理实在是外行,每一步都不会写,所以不断麻烦并请教各位老师,请原谅!
现在的问题是,我想按如下方式处理 HIVEDEF.INF 等 unicode 格式文件,需要老师帮忙:
'命令提示符下 输入的格式如 zzz.vbs -Saaa -TD:\zzz
'如参数为 aaa,则跳转到 Function  aaa();如参数为 bbb,则跳转到 Function  bbb();如参数为 ccc,则跳转到 Function  ccc();等等。
'源文件为 unicode,需要保持原格式不变
'如何接收第二个外部参数(变量),并截取 -T后面输入的路径作为变量(如 D:\zzz),后面将调用这个变量作为源文件的路径如 %zzz%
'如下格式执行不正确,如何修改?
Set oArgs = WScript.Arguments
If oArgs(0)="aaa" Then
  Call aaaSE()
ElseIf oArgs(0)="bbb" Then
  Call bbbSE()
ElseIf oArgs(0)="ccc" Then
  Call cccSE()
End If
'退出
Function  aaa()
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile("HIVEDEF.INF", 1, false, -1)  '其中的 HIVEDEF.INF,改为 %xxx%\HIVEDEF.INF
  s = f.ReadAll : f.Close
  s = Replace(f.ReadAll, "HKCU,""", "HKLM,""WB-default\")
  s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  fso.OpenTextFile("HIVEDEF.INF", 2, true, -1).Write s
'安装 %xxx%\HIVEDEF.INF
End Function
'退出
Function  bbb()
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile("HIVESFT.INF", 1, false, -1)  '其中的 HIVESFT.INF,改为 %xxx%\HIVESFT.INF
  s = f.ReadAll : f.Close
  s = Replace(f.ReadAll, "HKLM,""SOFTWARE\", "HKLM,""WB-software\")
  s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  fso.OpenTextFile("HIVESFT.INF", 2, true, -1).Write s
'安装 %xxx%\HIVESFT.INF
End Function
'退出
Function  ccc()
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set f = fso.OpenTextFile("HIVESYS.INF", 1, false, -1)  '其中的 HIVESYS.INF,改为 %xxx%\HIVESYS.INF
  s = f.ReadAll : f.Close
  s = Replace(f.ReadAll, "HKLM,""SYSTEM\", "HKLM,""WB-setup\")
  s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  fso.OpenTextFile("HIVESYS.INF", 2, true, -1).Write s
'安装 %xxx%\HIVESYS.INF
End Function
'退出COPY
...
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2
76626yyn

期待老师出手相助,感谢了!
76626yyn

TOP

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

这电脑慢的害人。
76626yyn

TOP

试试
msg = "命令提示符下 输入的格式如 zzz.vbs -Saaa -TD:\zzz"
Set fso = CreateObject("Scripting.FileSystemObject")
Set oArgs = WScript.Arguments
If oArgs.Count >= 2 Then
    fd = Mid(oArgs(1), 3) & "\"
ElseIf oArgs.Count = 1 Then
    fd = ".\"
Else
    MsgBox msg, , "提示" : WScript.Quit
End If
If Mid(oArgs(0), 3) = "aaa" Then
    Call ReplaceStr("HKCU,""", "HKLM,""WB-default\")
ElseIf Mid(oArgs(0), 3) = "bbb" Then
    Call ReplaceStr("HKLM,""SOFTWARE\", "HKLM,""WB-software\")
ElseIf Mid(oArgs(0), 3) = "ccc" Then
    Call ReplaceStr("HKLM,""SYSTEM\", "HKLM,""WB-setup\")
Else
    MsgBox msg, , "提示" : WScript.Quit
End If
Function ReplaceStr(s1, s2)
    Set f = fso.OpenTextFile(fd & "HIVEDEF.INF", 1, false, -1)
    s = f.ReadAll : f.Close
    s = Replace(s, s1, s2)
    s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
    fso.OpenTextFile(fd & "HIVEDEF.INF", 2, true, -1).Write s
End FunctionCOPY

TOP

回复 4# apang

首先感谢。

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

apang 老师辛苦了。
76626yyn

TOP

回复 4# apang


我把代码改为如下:
msg = "命令提示符下 输入的格式如 zzz.vbs -Saaa -TD:\zzz"
Set fso = CreateObject("Scripting.FileSystemObject")
Set oArgs = WScript.Arguments
If oArgs.Count >= 2 Then
    fd = Mid(oArgs(1), 3) & "\"
ElseIf oArgs.Count = 1 Then
    fd = ".\"
Else
    MsgBox msg, , "提示" : WScript.Quit
End If
If Mid(oArgs(0), 3) = "aaa" Then
    Call ReplaceDEF()
ElseIf Mid(oArgs(0), 3) = "bbb" Then
    Call ReplaceSFT()
ElseIf Mid(oArgs(0), 3) = "ccc" Then
    Call ReplaceSYS()
Else
    MsgBox msg, , "提示" : WScript.Quit
End If
Function ReplaceDEF()
  Set f = fso.OpenTextFile(fd & "HIVEDEF.INF", 1, false, -1)
  s = Replace(f.ReadAll, "HKCU,""", "HKLM,""WB-default\")
  s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  fso.OpenTextFile(fd & "HIVEDEF.INF", 2, true, -1).Write s
  f.Close
End Function
Function ReplaceSFT()
  Set f = fso.OpenTextFile(fd & "HIVESFT.INF", 1, false, -1)
  s = Replace(f.ReadAll, "HKLM,""SOFTWARE\", "HKLM,""WB-software\")
  s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  fso.OpenTextFile(fd & "HIVESFT.INF", 2, true, -1).Write s
  f.Close
End Function
Function ReplaceSYS()
  Set f = fso.OpenTextFile(fd & "HIVESYS.INF", 1, false, -1)
  s = Replace(f.ReadAll, "HKLM,""SYSTEM\", "HKLM,""WB-setup\")
  s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  fso.OpenTextFile(fd & "HIVESYS.INF", 2, true, -1).Write s
  f.Close
End FunctionCOPY
可以达到要求---aaa 时处理 HIVEDEF.INF,bbb 时处理 HIVESFT.INF,ccc 时处理 HIVESYS.INF,但问题来了:它区分大小写,也就是只能处理替换大写字符,请教如何让它不分大小写?
另外,可否处理完以后,运行安装如 HIVEDEF.INF?
bat 下安装 .inf 命令是 rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128(或132) D:\inf\default.inf,vbs 中如何做?
76626yyn

TOP

回复 6# yuanyannian


举例:
Function ReplaceSFT()
  Set ws = CreateObject("WScript.Shell")
  Set f = fso.OpenTextFile(fd & "HIVESFT.INF", 1, false, -1)
  s = f.ReadAll : f.Close
  Set re = New RegExp
  re.Pattern = "HKLM,""SOFTWARE\\"
  re.Global = true
  re.IgnoreCase = true
  s = re.Replace(s, "HKLM,""WB-default\")
  s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & vbCrLf & s
  fso.OpenTextFile(fd & "HIVESFT.INF", 2, true, -1).Write s
  ''ws.Run "rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 """ & fd & "HIVESFT.INF""", , true
End FunctionCOPY

TOP

回复 7# apang

好用,谢谢 apang 老师!

不过,如果需要替换两个以上不同的字符串,不分大小写就不行了。
另外,INF 安装总是失败。
76626yyn

TOP

回复 7# apang

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

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

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

TOP

本帖最后由 apang 于 2014-8-9 23:16 编辑
Dim msg, ws, oArgs, fd
msg = "Command prompt: HoJoHE.vbs -SHIVEDEF.INF -TD:\zzz"
msg = msg & vbLf & "or: HoJoHE.vbs -SHIVEDEF.INF -T""D:\zz z"""
Set ws = CreateObject("WScript.Shell")
Set oArgs = WScript.Arguments
If oArgs.Count >= 2 Then
    fd = Mid(oArgs(1), 3) & "\"
ElseIf oArgs.Count = 1 Then
    fd = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
Else Call HoJoHlp()
End If
Dim file, fso, f, s
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FileExists(fd & Mid(oArgs(0), 3)) Then
    msg = "Input Path or File Name Error" & vbLf & msg
    Call HoJoHlp()
End If
file = fso.GetFile(fd & Mid(oArgs(0), 3)).ShortPath
Set f = fso.OpenTextFile(file, 1, false, GetFileFormat(file))
s = f.ReadAll : f.Close
Select Case UCase(Mid(oArgs(0), 3))
    Case "HIVEDEF.INF"
        s = ReplaceStr(s, "HKCU, *""", "HKLM,""WB-default\")
    Case "HIVESFT.INF"
        s = ReplaceStr(s, "HKLM, *""SOFTWARE\\", "HKLM,""WB-software\")
    Case "HIVESYS.INF"
        s = ReplaceStr(s, "HKLM, *""SYSTEM\\", "HKLM,""WB-setup\")
    Case "HIVECLS.INF"
        s = ReplaceStr(s, "HKLM, *""SOFTWARE\\", "HKLM,""WB-software\")
        s = ReplaceStr(s, "HKCR, *""", "HKLM,""WB-software\Classes\")
        s = ReplaceStr(s, "HKCR,\.", "HKLM,WB-software\Classes\.")
    Case Else Call HoJoHlp()
End Select
fso.OpenTextFile(file, 2, true, -1).Write s
ws.Run "rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 " & file, , true
MsgBox "OK"
Function GetFileFormat(ByVal file)
    Dim Bin
    with CreateObject("Adodb.Stream")
        .Type = 1
        .Mode = 3
        .Open
        .Position = 0
        .Loadfromfile file
        Bin = .read(2)
    End with
    If AscB(MidB(Bin,1,1))=&HFF and AscB(MidB(Bin,2,1))=&HFE Then
        GetFileFormat = -1   ''unicode
    Else GetFileFormat = 0   ''ansi
    End If
End Function
Function ReplaceStr(ByVal s, pattern, s1)
    Dim re
    If Left(s, 16) <> "[DEFAULTINSTALL]" Then
        s = "[DEFAULTINSTALL]" & vbCrLf & "ADDREG = AddReg" & vbCrLf & s
    End If
    Set re = New RegExp
    re.Pattern = pattern
    re.Global = true
    re.IgnoreCase = true
    ReplaceStr = re.Replace(s, s1)
End Function
Function HoJoHlp()
    MsgBox msg : WScript.Quit
End FunctionCOPY
1

评分人数

TOP

回复 10# apang

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

谢!谢!谢!
76626yyn

TOP

回复 10# apang

第一部分修改了一下,意思是判断在三个参数、两个参数、一个参数情况下执行的结果,要求准确输入参数,不知可对?
If oArgs.Count = 3 Then
    If Left(oArgs(0),2) = "-S" and (Left(oArgs(1),2) = "-T") and (Left(oArgs(2),2) = "-I") Then
        sd = Mid(oArgs(2), 3) & "\"
        fd = Mid(oArgs(1), 3) & "\"
    Else MsgBox "Input error!"&vbcrlf&vbcrlf&msg : WScript.Quit
    End If
ElseIf oArgs.Count = 2 Then
    If Left(oArgs(0),2) = "-S" and (Left(oArgs(1),2) = "-T") Then
        sd = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
        fd = Mid(oArgs(1), 3) & "\"
    Else MsgBox "Input error!"&vbcrlf&vbcrlf&msg : WScript.Quit
    End If
ElseIf oArgs.Count = 1 Then
    If oArgs(0) = "?" Then
        MsgBox msg
    ElseIf Left(oArgs(0),2) = "-S" Then
        sd = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
        fd = Left(WScript.ScriptFullName,InStrRev(WScript.ScriptFullName,"\"))
    Else MsgBox "Input error!"&vbcrlf&vbcrlf&msg : WScript.Quit
    End If
Else MsgBox "Input error!"&vbcrlf&vbcrlf&msg : WScript.Quit
End IfCOPY
76626yyn

TOP

回复 10# apang


刚才发现 Case 语句不好用,输入序列以外的任意文件,总提示“文件无法打开”,并不显示 msgbox?
76626yyn

TOP

回复 12# yuanyannian


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

TOP

返回列表