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

TOP

回复 8# wh1234567
vbs
  1. Hive = "HKEY_LOCAL_MACHINE"
  2. KeyPath = "Software\333"
  3. ValueName = "444"
  4. Set ws = CreateObject("WScript.Shell")
  5. Set Sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
  6. Set objWMIServices = GetObject("winmgmts:" & _
  7.     "{impersonationLevel=impersonate}!\\.\root\default")
  8. objWMIServices.ExecNotificationQueryAsync Sink, _
  9.     "Select * from RegistryValueChangeEvent Where " & _
  10.     "Hive = '"&Hive&"' and " & _
  11.     "KeyPath = '"&Replace(KeyPath,"\","\\")&"' and " & _
  12.     "ValueName = '"&ValueName&"'"
  13. WScript.Echo "Listening for Registry Change Events..." & vbCrLf
  14. Do : WScript.Sleep 1000 : Loop
  15. Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
  16.     Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
  17.     'WScript.Echo Value
  18.     if CStr(Value)="29" then ws.Run "a.bat",0
  19. End Sub
复制代码
1

评分人数

TOP

回复 12# wh1234567


    对。a.bat可用其他程序代替。

TOP

回复 15# wh1234567


    这就是6楼问你的目的,9楼的代码正是运行后一直监视。

TOP

回复 18# wh1234567

为了便于显示,作了少许修改,但不影响原有功能。
C:\Users\root\Desktop>type a.bat
@echo hello&pause

C:\Users\root\Desktop>type a.vbs
...
Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
    WScript.Echo "Registry Value Changed: " & Value
    if CStr(Value)="29" then ws.Run "a.bat" ',0 '后面加0表示隐藏窗口运行

End Sub

C:\Users\root\Desktop>start /b cscript C:\Users\root\Desktop\a.vbs

Listening for Registry Change Events...

C:\Users\root\Desktop>reg add hklm\Software\333 /v 444 /d 28 /f
操作成功完成。

Registry Value Changed: 28

C:\Users\root\Desktop>reg add hklm\Software\333 /v 444 /d 29 /f
操作成功完成。

Registry Value Changed: 29

C:\Users\root\Desktop>


vbs运行a.bat弹出了一个窗口:
hello
请按任意键继续. . .

TOP

回复 20# wh1234567


    你想说什么呢?

TOP

回复 22# wh1234567


那你的
hello
请按任意键继续. .
是怎么来的呢?

和你们交流真是累死了。。。

TOP

回复 25# wh1234567


    你把19楼的内容好好看一遍,对比一下你是哪里写的有问题。

TOP

19楼引用的内容是在cmd中手动执行命令进行演示的过程。
...是英文省略号,表示省略9楼代码的相同部分以免浪费,还特意用蓝色区分与9楼代码不同的地方。浅蓝色是vbs的执行结果。

TOP

回复 29# wh1234567


    省略路径当然也可以。
那是我的cmd初始目录不是C:\Users\root\Desktop,而在其他地方运行过那条命令,后来我切换到桌面,直接按↑↓方向键调出历史命令,懒得重新输入。

你的bat随便放在哪里都可以,只要在ws.Run那里填上正确的路径即可(相对路径也行)。
这个vbs的作用只是监视注册表和启动bat,你在bat里可以随便写,已经与这个vbs无关了。

TOP

回复 31# wh1234567


     28楼:“19楼引用的内容是在cmd中手动执行命令进行演示的过程。”同学你没睡醒吧?

TOP

回复 33# wh1234567


19楼的代码已经演示了,完全正常,不知为何到你那里就有各种问题。
1、你的操作系统是什么?
2、你的用户权限够不够?
3、请帖出你的完整代码。

TOP

本帖最后由 powerbat 于 2012-6-7 14:27 编辑

回复 36# wh1234567


Microsoft Windows XP [版本 5.1.2600]
(C) 版权所有 1985-2001 Microsoft Corp.

C:\Documents and Settings\Administrator>cd /d D:\

D:\>type a.vbs
Hive = "HKEY_LOCAL_MACHINE"
KeyPath = "Software\333"
ValueName = "444"

Set ws = CreateObject("WScript.Shell")
Set Sink = WScript.CreateObject("WbemScripting.SWbemSink", "SINK_")
Set objWMIServices = GetObject("winmgmts:" & _
    "{impersonationLevel=impersonate}!\\.\root\default")
objWMIServices.ExecNotificationQueryAsync Sink, _
    "Select * from RegistryValueChangeEvent Where " & _
    "Hive = '"&Hive&"' and " & _
    "KeyPath = '"&Replace(KeyPath,"\","\\")&"' and " & _
    "ValueName = '"&ValueName&"'"
WScript.Echo "Listening for Registry Change Events..." & vbCrLf
Do : WScript.Sleep 1000 : Loop

Sub SINK_OnObjectReady(wmiObject, wmiAsyncContext)
    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
    WScript.Echo "Registry Value Changed: " & Value
    if CStr(Value)="29" then ws.Run "a.bat" ',0 '后面加0表示隐藏窗口运行
End Sub

D:\>type a.bat
@echo hello&pause

D:\>start /b cscript a.vbs

Listening for Registry Change Events...

D:\>reg add hklm\Software\333 /v 444 /d 28 /f
操作成功结束

Registry Value Changed: 28

D:\>reg add hklm\Software\333 /v 444 /d 29 /f
操作成功结束

Registry Value Changed: 29

==============================================================================
vbs自动运行a.bat弹出了一个窗口:
hello
请按任意键继续. . .

==============================================================================

D:\>reg add hklm\Software\333 /v 444 /d 27 /f
操作成功结束

Registry Value Changed: 27

D:\>reg add hklm\Software\333 /v 444 /d 29 /f
操作成功结束

Registry Value Changed: 29

==============================================================================
vbs自动运行a.bat弹出了一个窗口:
hello
请按任意键继续. . .

==============================================================================

D:\>


再看不懂你就不要学批处理了。。。

TOP

脚本中什么读过 HKEY_LOCAL_MACHINE\333\444 ?不要胡乱构造!
打开一个cmd,用cscript运行vbs,方便调试,所有信息都会在cmd中显示,既方便查看又便于复制。
你1楼的提问并不是说“大于29”,而是“为29”,请准确描述自己的问题。
好几处都是这样,你自己都说不清楚,别人怎么帮你呢?

TOP

RegRead那个没问题,vbs与reg命令语法不一样。

你运行vbs后始终会报错吗?没有成功运行a.bat的情况出现?如果始终出错,可能是你的系统有问题。
如果只是偶尔出现“法打开注册键值进行读取”的错误,那可能是某个程序对注册表该位置进行了锁定或设置了权限,造成vbs无法读取。

TOP

返回列表