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

[注册表类] [已解决]批处理监视注册表项

本帖最后由 wh1234567 于 2012-6-16 14:44 编辑

当监视某个注册表项名称数值为29时就执行我的命令,如果监视数值不是29就不执行命令,如何写?
例如
注册表项"HKEY_LOCAL_MACHINE\333" 里右边的名称"444" 里的数值29

我的命令放在下面
1

评分人数

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

完全搞定,谢谢powerbat

TOP

  1. Hive = "HKEY_LOCAL_MACHINE"
  2. KeyPath = "Software\333"
  3. ValueName = "444"
  4. shuzhi = 29
  5. gaiwei = 20
  6. Hive2 = "HKEY_LOCAL_MACHINE"
  7. KeyPath2 = "Software\2012"
  8. ValueName2 = "0610"
  9. shuzhi2 = 98
  10. gaiwei2 = 70
  11. strTitle = "注册表监视"
  12. nShowTime = 3
  13. WQL = "Select * from RegistryValueChangeEvent Where (" & _
  14.     "Hive = '"&Hive&"' and " & _
  15.     "KeyPath = '"&Replace(KeyPath,"\","\\")&"' and " & _
  16.     "ValueName = '"&ValueName&"') OR (" & _
  17.     "Hive = '"&Hive2&"' and " & _
  18.     "KeyPath = '"&Replace(KeyPath2,"\","\\")&"' and " & _
  19.     "ValueName = '"&ValueName2 & "') "
  20. Set ws = CreateObject("WScript.Shell")
  21. CheckReg ValueName
  22. CheckReg ValueName2
  23. Set Sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
  24. Set objWMIServices = GetObject("winmgmts:" & _
  25.     "{impersonationLevel=impersonate}!\\.\root\default")
  26. objWMIServices.ExecNotificationQueryAsync Sink, WQL
  27. ws.Popup "Listening for Registry Change Events...", nShowTime, strTitle, 4096
  28. Do : WScript.Sleep 1000 : Loop
  29. Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  30.     'WScript.Echo wmiObject.GetObjectText_()
  31.     CheckReg wmiObject.ValueName
  32. End Sub
  33. Sub CheckReg(VName)
  34.   On Error Resume Next
  35.   RegFullPath = Hive & "\" & KeyPath & "\" & ValueName
  36.   RegFullPath2 = Hive2 & "\" & KeyPath2 & "\" & ValueName2
  37.   if VName=ValueName then
  38.       Value = ws.RegRead(RegFullPath)
  39.       if Err then
  40.         ws.RegWrite RegFullPath, gaiwei, "REG_DWORD"
  41.         Err.Clear
  42.       end if
  43.       if CStr(Value)=CStr(shuzhi) then
  44.         ws.Popup RegFullPath & " 变成了 " & shuzhi, nShowTime, strTitle, 4096
  45.         ws.RegWrite RegFullPath, gaiwei, "REG_DWORD"
  46.       end if
  47.   end if
  48.   if VName=ValueName2 then
  49.       Value = ws.RegRead(RegFullPath2)
  50.       if Err then
  51.         ws.RegWrite RegFullPath2, gaiwei2, "REG_DWORD"
  52.         Err.Clear
  53.       end if
  54.       if CStr(Value)=CStr(shuzhi2) then
  55.         ws.Popup RegFullPath2 & " 变成了 " & shuzhi2, nShowTime, strTitle, 4096
  56.         ws.RegWrite RegFullPath2, gaiwei2, "REG_DWORD"
  57.       end if
  58.   end if
  59. End Sub
复制代码
2

评分人数

    • zqz0012005: 乐于助人PB + 10 技术 + 1
    • wh1234567: 谢谢您给我满意的答案,很感激您,可惜我再 ...技术 + 1

TOP

本帖最后由 wh1234567 于 2012-6-11 14:14 编辑

回复 62# powerbat


    另外一个数值的注册表路径是:
Hive2 = "HKEY_LOCAL_MACHINE"
KeyPath2 = "Software\2012"
ValueName2 = "0610"
shuzhi2 =98(这里是指要监视的数值)
gaiwei2 =70(这里是指要修改为的数值)

TOP

另外一个数值的注册表路径是什么?

TOP

回复 60# powerbat


    很感谢您,最后请求了

另外:
Hive = "HKEY_LOCAL_MACHINE"
KeyPath = "Software\333"
ValueName = "444"
shuzhi =29
gaiwei =20
这样的话
    if CStr(Value)="29" then
        ws.Popup "注册表值变成了29", 3, "通知"
        ws.RegWrite Hive&"\"&KeyPath&"\"&ValueName, 20, "REG_DWORD"
这里该如何修改呢?
如果想同时这样监视2个数值的话,不知道如何添加代码?
最后的求助了实在不好意思,完美后我就关闭问题了

TOP

  1. Hive = "HKEY_LOCAL_MACHINE"
  2. KeyPath = "Software\333"
  3. ValueName = "444"
  4. On Error Resume Next
  5. Set ws = CreateObject("WScript.Shell")
  6. SINK_OnObjectReady 0, 0
  7. Set Sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
  8. Set objWMIServices = GetObject("winmgmts:" & _
  9.     "{impersonationLevel=impersonate}!\\.\root\default")
  10. objWMIServices.ExecNotificationQueryAsync Sink, _
  11.     "Select * from RegistryValueChangeEvent Where " & _
  12.     "Hive = '"&Hive&"' and " & _
  13.     "KeyPath = '"&Replace(KeyPath,"\","\\")&"' and " & _
  14.     "ValueName = '"&ValueName&"'"
  15. WScript.Echo "Listening for Registry Change Events..." & vbCrLf
  16. Do : WScript.Sleep 1000 : Loop
  17. Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  18.     Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
  19.     'WScript.Echo Value
  20.     if CStr(Value)="29" then
  21.         ws.Popup "注册表值变成了29", 3, "通知"
  22.         ws.RegWrite Hive&"\"&KeyPath&"\"&ValueName, 20, "REG_DWORD"
  23.     end if
  24. End Sub
复制代码

TOP

回复 53# powerbat

你好,辛苦您了,不知道你还能不能再按照56楼的更新下这个vbs 呢?

TOP

不听老人言,吃亏在眼前!
此帖可以说是最长最无聊的帖子!
人家早就说了让你把代码帖出来,你偏不听,非说自己代码和别人一样,结果怎样?而且自己有什么需求、碰到什么问题都不描述清楚,靠别人像挤牙膏似的问一点你才说一点,把大家的耐心都耗尽了,最终没人愿意回答你的问题了。楼主应该好好学一下提问的方法。
提问的智慧 http://www.bathome.net/thread-4054-1-1.html
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

回复 55# bluewing009


    我表示看不懂。目测楼主更看不懂。

TOP

本帖最后由 wh1234567 于 2012-6-9 00:07 编辑

回复 53# powerbat

不好意思,我找到错误的原因了,是因为自动执行a.bat,这个批处理将444删除了导致会弹出那个错误窗口
你修正下那个当第一次运行时如果原数值就是29的话无法执行a.bat的问题吧
另外,我想能不能将第一次运行时弹出的窗口和数值变化时弹出的窗口过3秒钟后自动关闭,不需要手动点击确定的那种,还有与其发现数值是29时执行a.bat还不如直接用vbs将数值29自动修改为20,你看行不行,那个a.bat就不需要了。
标题能不能显示为:注册表监视小工具

TOP

我记得我写了一个例子,监控注册表的……………………如果你看那个有问题再问我。

TOP

本帖最后由 wh1234567 于 2012-6-8 19:56 编辑

打开一个cmd,按37楼的步骤把那些红色的命令逐条运行一次,确认没问题能正常执行,也不弹出错误窗口。
但是如果直接运行a.vbs的话当数值变化成29时就会弹出那个错误窗口,同时也会自动执行a.bat。
为什么?

TOP

你说按37楼的步骤测试能行,那为什么还会出现第2个问题“弹出错误窗口”?出现错误了就说明不可行,你为什么要说测试可行呢?
不知道该说你可爱呢还是天真。。。

TOP

在线等......

TOP

返回列表