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

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
请按任意键继续. . .

你这个是vbs的还是bat的?感觉很乱,并且不能运行提示错误,你能不能整理下

TOP

回复 31# wh1234567


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

TOP

脚本:        C:\Documents and Settings\Administrator\桌面\新建 文本文档 (2).vbs
行:        18
字符:        5
错误:        无法打开注册键值 "HKEY_LOCAL_MACHINE\333\444" 进行读取。
代码:        80070002
源:         WshShell.RegRead

这个代码需修正,应该是"HKEY_LOCAL_MACHINE\333" 里右边的名称"444
而不是HKEY_LOCAL_MACHINE\333\444

会出错的,另外,当第一次运行时注册表项数值正好是29的话就无法执行a.bat 了,

TOP

本帖最后由 wh1234567 于 2012-6-7 01:20 编辑

Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)
会弹出错误的对话框,是不是需修正下这个代码?
另外,能不能弄成当第一次运行或在监视的过程中发现数值是大于29就自动执行a.bat,这样比较稳定一些,

TOP

回复 33# wh1234567


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

TOP

本帖最后由 wh1234567 于 2012-6-7 13:35 编辑

xp的,代码就是复制你的9楼的代码,19楼的我看不懂,没法测试成功

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

嗯,就是这个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

但是如何第一次运行这个vbs,当数值大于29时就好像无法执行a.bat 了,另外发现当数值由其他数变化到29时才会执行a.bat ,而且会弹出错误的窗口。甚至个别时候数值变化到29也无法执行a.bat
这2个问题还得您需要修正一下代码,弄成运行后监视到数值大于29时就全自动执行a.bat,和修正弹出错误的窗口
弹出错误的窗口的原因可能是
Hive = "HKEY_LOCAL_MACHINE"
KeyPath = "Software\333"
ValueName = "444"
....
    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName)

TOP

弹出错误窗口内容如下:

脚本:        C:\Documents and Settings\Administrator\桌面\新建 文本文档 (2).vbs
行:        18
字符:        5
错误:        无法打开注册键值 "HKEY_LOCAL_MACHINE\333\444" 进行读取。
代码:        80070002
源:         WshShell.RegRead

红色的这个显示不对吧?估计是代码的问题,识别错误了

TOP

本帖最后由 wh1234567 于 2012-6-7 16:22 编辑

是当监视到数值是大于29就自动执行a.bat,而不是数值变化到29才执行a.bat,呵呵呵,如果原数值或者是变化到的数值是例如20或32就无能为力了不能执行a.bat了吧?
并不是按照顺序由28变化到29才执行a.bat,而是不管原数值是多少,只要发现是29就自动执行a.bat

TOP

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

TOP

嗯,是的,如果第一次运行(原数值就是29就不能执行a.bat了,需修正)发现是29就自动执行a.bat,这样就比较完美了
Hive = "HKEY_LOCAL_MACHINE"
KeyPath = "Software\rdc"
ValueName = "444"

我把333改为rdc,444是数值,不应该跟到这个\后面吧.
当数值变化为29时在执行a.bat时就会弹出这个错误窗口,

TOP

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

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

TOP

是不是问题出在    Value = ws.RegRead(Hive&"\"&KeyPath&"\"&ValueName) 这里?
现在就是这2个问题需修正:
1.如果第一次运行(原数值正好就是29就不能执行a.bat了,需修正)发现是29就自动执行a.bat
2.弹出错误窗口

TOP

请打开一个cmd,按37楼的步骤把那些红色的命令逐条运行一次,确认一下是不是你的系统有问题。
确定没问题了就一切好说,不然大家永远无法沟通。

TOP

返回列表