[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 apang 于 2014-10-30 09:40 编辑

我这里ws.regwrite写入是问号,wmi写入正常,试试看
  1. Dim fso, txt, re, m, regPath, regValue, regData
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. txt = fso.OpenTextFile("HIVESFT.INF", 1, false, -1).ReadAll
  4. txt = txt & vbCrLf & "["
  5. Set re = New RegExp
  6. re.Pattern = "^ *\[Strings] *$[\s\S]*?(?=^ *\[)"
  7. re.IgnoreCase = true
  8. re.Global = true
  9. re.MultiLine = true
  10. If Not re.Test(txt) Then WScript.Quit
  11. txt = re.Execute(txt)(0)
  12. re.Pattern = "^ *(BIOS|NDIS) *= *(.+)"
  13. For Each m in re.Execute(txt)
  14.         regPath = "yyn\Desktop"
  15.         regData = Replace(m.SubMatches(1), chr(34), "")
  16.         If UCase(m.SubMatches(0)) = "BIOS" Then
  17.                 regValue = "yyn1"
  18.         Else
  19.                 regValue = "yyn2"
  20.         End If
  21.         WriteToRegValue regPath, regValue, regData
  22. Next
  23. Sub WriteToRegValue(ByVal regPath, ByVal regValue, ByVal regData)
  24.         Const HKCU = &H80000001
  25.         Dim regWMI
  26.         Set regWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\Default:StdRegProv")
  27.         regWMI.CreateKey HKCU, regPath
  28.         regWMI.SetStringValue HKCU, regPath, regValue, regData
  29. End Sub
复制代码

TOP

本帖最后由 yuanyannian 于 2014-10-30 06:51 编辑

回复 16# apang

谢谢 apang 老师出手,读、写均正常。
不过,我的需求是:只读出 =  后面的内容作为变量,写入注册表中的路径、键值是需要自定义的,比如 HKCU\yyn\Desktop, yyn(键值), BIOS 或 NDIS (还有很多其它的) = 后面的内容(数据), 或者如注册表文件:

[HKEY_CURRENT_USER\yyn\Desktop]
"yyn1"="대한민국 표준시"
"yyn2"="한국어"

或:
[HKEY_CURRENT_USER\yyn\System\Test]
"yyn3"="한국어 입력 시스템 (IME 2000)"
"yyn4"="한"

或者将读出的数据分别写成注册表文件,再自行导入注册表也可。比如写成注册表文件 (unicode 格式):

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\yyn\Desktop]
"yyn1"="대한민국 표준시"
"yyn2"="한국어"

[HKEY_CURRENT_USER\yyn\System\Test]
"yyn3"="한국어 입력 시스템 (IME 2000)"
"yyn4"="한"

有劳 apang 老师了。
76626yyn

TOP

回复 17# yuanyannian


    已修改,如果想自定义,更改相应变量的值即可

TOP

回复 18# apang

是这样吗?
  1. Dim fso, txt, re, m, regPath, regValue, regData
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. txt = fso.OpenTextFile("HIVESFT.INF", 1, false, -1).ReadAll
  4. txt = txt & vbCrLf & "["
  5. Set re = New RegExp
  6. re.Pattern = "^ *\[Strings] *$[\s\S]*?(?=^ *\[)"
  7. re.IgnoreCase = true
  8. re.Global = true
  9. re.MultiLine = true
  10. If Not re.Test(txt) Then WScript.Quit
  11. txt = re.Execute(txt)(0)
  12. re.Pattern = "^ *(BIOS|NDIS|NETWORK_DDE|NETWORK_DDE_DESCRIPTION|NETWORK_DDE_DSDM) *= *(.+)"
  13. For Each m in re.Execute(txt)
  14.     regData = Replace(m.SubMatches(1), chr(34), "")
  15.     If UCase(m.SubMatches(0)) = "BIOS" Then
  16.         regPath = "yyn\Desktop"
  17.         regValue = "yyn1"
  18.     End If
  19.     If UCase(m.SubMatches(0)) = "NDIS" Then
  20.         regPath = "yyn\Desktop\yyn"
  21.         regValue = "yyn2"
  22.     End If
  23.     If UCase(m.SubMatches(0)) = "NETWORK_DDE" Then
  24.         regPath = "yyn\Test"
  25.         regValue = "yyn3"
  26.     End If
  27.     If UCase(m.SubMatches(0)) = "NETWORK_DDE_DESCRIPTION" Then
  28.         regPath = "yyn\Test\yyn"
  29.         regValue = "yyn4"
  30.     End If
  31.     If UCase(m.SubMatches(0)) = "NETWORK_DDE_DSDM" Then
  32.         regPath = "yyn\yyn\yyn"
  33.         regValue = "yyn5"
  34.     End If
  35.     WriteToRegValue regPath, regValue, regData
  36. Next
  37. Sub WriteToRegValue(ByVal regPath, ByVal regValue, ByVal regData)
  38.     Const HKCU = &H80000001
  39.     Dim regWMI
  40.     Set regWMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\Default:StdRegProv")
  41.     regWMI.CreateKey HKCU, regPath1
  42.     regWMI.SetStringValue HKCU, regPath, regValue, regData
  43. End Sub
复制代码
但提示:

另外,在 re.Pattern = "^ *(BIOS|NDIS|NETWORK_DDE|NETWORK_DDE_DESCRIPTION|NETWORK_DDE_DSDM) *= *(.+)" 中,如果需要几十个变量,该如何处理?
76626yyn

TOP

提示现象是我把 regWMI.CreateKey HKCU, regPath1 搞错了。

另外,我把 HKCU 改成 HKLM ,把  Const HKCU = &H80000001 改为     Const HKLM = &H80000002,失败。
76626yyn

TOP

回复 19# yuanyannian


    还是保存到reg文件吧,少一点弯弯绕
  1. Dim s1, s2, strSection, arField, arValue, arPath
  2. s1 = "HKEY_CURRENT_USER\"
  3. s2 = "HKEY_LOCAL_MACHINE\"
  4. strSection = "Strings"
  5. arField = Array("BIOS", "NDIS", "GULIM")
  6. arValue = Array("yyn1", "yyn2", "yyn3")
  7. arPath = Array(s1 & "yyn\Desktop", s1 & "yyn\Test", s2 & "Software\Test\yyn")
  8. Dim fso, txt, re, i, regData
  9. Set fso = CreateObject("Scripting.FileSystemObject")
  10. txt = fso.OpenTextFile("HIVESFT.INF", 1, false, -1).ReadAll
  11. txt = txt & vbCrLf & "["
  12. Set re = New RegExp
  13. re.Pattern = "^ *\[" & strSection & "] *$[\s\S]*?(?=^ *\[)"
  14. re.IgnoreCase = true
  15. re.Global = true
  16. re.MultiLine = true
  17. If Not re.Test(txt) Then WScript.Quit
  18. txt = re.Execute(txt)(0)
  19. For i = 0 to UBound(arField)
  20.         re.Pattern = "^ *" & arField(i) & " *= *("".*"")"
  21.         If re.Test(txt) Then
  22.                 regData = re.Execute(txt)(0).SubMatches(0)
  23.                 s = s & "[" & arPath(i) & "]" & vbCrLf
  24.                 s = s & """" & arValue(i) & """=" & regData & vbCrLf
  25.                 s = s & vbCrLf
  26.         End If
  27. Next
  28. s = "Windows Registry Editor Version 5.00" & vbCrLf & vbCrLf & s
  29. fso.OpenTextFile("Result.reg", 2, true, -1).Write s
复制代码

TOP

这样也好,19楼的代码不能写入 HKLM 应该是对该根键没有权限造成的,路径写入 HKLM 的子键中是则可以。
再次谢谢 apang 老师。

再请问,如果不需要搜索 [strings], 去掉那些代码?
76626yyn

TOP

回复 22# yuanyannian


    代码是先找到 Strings 节,再在Strings节中找相应的字段。
比如 BIOS 字段,在Strings中有,在其它节也可能有。
如果去掉Strings节名,找到的可能就不正确,你希望这样吗?

TOP

回复 23# apang

有道理,那我采用写入注册表文件。
76626yyn

TOP

回复 23# apang

再麻烦 apang 老师,测试中发现一个问题:当源文件等号后面的数据没有 "" 情况下,无法读出及写入注册表文件。
76626yyn

TOP

回复 25# yuanyannian


    不带双引号还是 REG_SZ 类型吗?你不说清楚那我只考虑一种类型,不考虑其它类型或其它特殊情况

TOP

回复 26# apang

是的,都是字符串 - REG_SZ 的。
76626yyn

TOP

回复 27# yuanyannian


    第25行下面插入一行:
  1. regData = chr(34) & Replace(regData, chr(34), "") & chr(34)
复制代码
第23行改成:
  1. re.Pattern = "^ *" & arField(i) & " *= *([^\r\n]+)"
复制代码

TOP

回复 28# apang

可以了,非常感谢!
76626yyn

TOP

返回列表