手机
当前位置:查字典教程网 >脚本专栏 >vbs >用vbs记录屏幕保护程序的开始时间和结束时间
用vbs记录屏幕保护程序的开始时间和结束时间
摘要:问:您好,脚本专家!如何记录屏幕保护程序的开始时间和结束时间?--JS答:您好,JS。您知道,一位脚本专家(嘿,谁说“肯定是Greg”?)年...

问:

您好,脚本专家!如何记录屏幕保护程序的开始时间和结束时间?

--JS

答:

您好,JS。您知道,一位脚本专家(嘿,谁说“肯定是Greg”?)年纪大得记得屏幕保护程序刚出现的日子。那时,这类脚本毫无意义。毕竟,屏幕保护程序启动后,每个人都神魂颠倒,从未想过让它结束。事实上,作为计算机支持人员的这位脚本专家首先必须做的一件事就是在每个人的桌面上创建快捷方式,使他们能够随时启动“飞转的小烤炉”。

那时人们很容易得到快乐。

啊,但是活在过去没有意义,对吧?在今天的现代社会中,显然不仅需要停止屏幕保护程序,还需要记录停止的时间。明确这一点后,让我们来看一看下面这个WMI事件监控脚本,它会跟踪屏幕保护程序的每次启动和停止:

复制代码 代码如下:

strComputer="."

SetobjWMIService=GetObject("winmgmts:"&strComputer&"rootcimv2")

SetobjEventSource=objWMIService.ExecNotificationQuery_

("SELECT*FROM__InstanceOperationEventWITHIN5WHERETargetInstanceISA'Win32_Process'")

DoWhileTrue

SetobjEventObject=objEventSource.NextEvent()

IfRight(objEventObject.TargetInstance.Name,4)=".scr"Then

SelectCaseobjEventObject.Path_.Class

Case"__InstanceCreationEvent"

Wscript.Echo"Screensaver"&objEventObject.TargetInstance.Name&_

"started:"&Now

Case"__InstanceDeletionEvent"

Wscript.Echo"Screensaver"&objEventObject.TargetInstance.Name&_

"ended:"&Now

EndSelect

EndIf

Loop

它看起来的确有点复杂,不是吗?但是别慌:就设计而言,WMI事件脚本总是看起来有点复杂。幸运的是,这些脚本只是看起来复杂;您会看到,这些脚本实际上并不那么难理解。

注意:好吧,我们最好对最后一句陈述加以限定:只要您了解WMI事件构成的基本思想,就不那么难理解。如果您还不了解,最好花点时间看看脚本编写第2周网络广播。这个网络广播将为您提供了理解今天专栏文章所需的所有背景信息。

好主意!尽管可能没有有助于搞清楚我们的某一篇专栏文章的信息,但至少有助于搞清楚这个脚本代码的意思。

这个特定脚本的开始是以历史悠久的方式连接到本地计算机上的WMI服务。通常到这里,我们要执行WMI查询以返回信息。正如您所看到的,在这个脚本中我们也要这么做,只是查询看起来有点不同:

SetobjEventSource=objWMIService.ExecNotificationQuery_

("SELECT*FROM__InstanceOperationEventWITHIN5WHERETargetInstanceISA'Win32_Process'")

不用说,这不是您所习惯编写的WMI查询类型,因为我们调用的是ExecNotificationQuery方法,而不是ExecQuery。(为什么呢?因为要监控WMI事件,就必须使用ExecNotificationQuery方法。)今天我们无法详细解释这个查询,但我们可以说,我们要求WMI只要有WMI事件(创建、删除、修改)发生,就立刻通知我们。这里只有一个问题:我们只想当TargetInstance(创建、删除或修改的项目)是Win32_Process类的实例时才得到通知。

注意:当然,从技术角度来说,还有第二个问题:我们只是每5秒钟检查一次新事件。如果屏幕保护程序启动,3秒钟之后结束,我们很可能就不会得到通知了。

换句话说,假设创建了一个新文件。新文件是Win32_Process类的实例吗?不是;它是CIM_DataFile类的实例。因此,我们不想得到通知。假设修改了一个服务。我们想要得到通知吗?不想要,因为服务是Win32_Service类的实例。好了,假设新进程(例如屏幕保护程序)启动。我们想要得到通知吗?当然想要。别忘了,新进程可是Win32_Process类的实例。任何时候如果创建、删除或修改进程,我们都想得到通知。

不过,这些您已经意识到了,对吧?

为了获得这些通知,我们建立一个当True等于True时运行的Do循环:

DoWhileTrue

句子的语法确实有点怪异,但这个语法却能够使脚本不停运行,并且不停监控进程的创建、删除和修改,直到终止脚本或重新启动计算机。如果没有这样的循环,脚本会通知我们屏幕保护程序何时启动,但是,随后脚本就会结束。结果,我们永远也不会得到屏幕保护程序何时结束的通知。

在循环内,我们首先要做的就是执行下面这行代码:

SetobjEventObject=objEventSource.NextEvent()

我们所做的是告诉脚本等待,直到下一个我们所关心的事件发生。换句话说,脚本将停留在此行代码上,直到有进程被创建、删除或修改。假设进程始终不变,假设我们始终不创建、删除或修改进程。在这种情况下,脚本就会永远停在这儿,耐心等待。以防万一。

现在,我们知道您正在想什么。您正在想:“嗨,稍等一下。我们只关心屏幕保护程序。MicrosoftWord也在进程中运行。如果我们启动MicrosoftWord,从而创建Winword.exe进程的新实例,那不也会触发通知吗?”

您说对了:会触发通知。接下来这行代码就用来解决这个问题。启动Word(或者任何可执行文件,就这一点而言)确实都会发出通知。但我们可以使用下面这行代码解决这个问题:

IfRight(objEventObject.TargetInstance.Name,4)=".scr"Then

在这里,我们使用Right函数检查触发通知的进程的名称。如果名称中最右侧的四个字符等于.scr,我们便假定正在处理的是屏幕保护程序,因为屏幕保护程序的名称类似Marquee.scr。如果名称中的最后四个字符不是.scr,我们便只是循环一次,然后等待下一个事件发生。

那么,如果最后四个字符是.scr会怎样?在这种情况下,我们只关心两种可能:屏幕保护程序启动或屏幕保护程序结束。(我们并不关心是否有人修改屏幕保护程序的属性。)为处理这两种可能,我们设置一个SelectCase块,用于检查事件实例的Class:

SelectCaseobjEventObject.Path_.Class

如果Class等于__InstanceCreationEvent,则意味着已创建新进程(即新屏幕保护程序)。在第一个Case语句中,我们检查Class是否等于__InstanceCreationEvent。如果等于,我们便回显如下事实:特定屏幕保护程序(使用进程名称表示)在特定时间(使用VBScript函数Now)启动:

Case"__InstanceCreationEvent"

Wscript.Echo"Screensaver"&objEventObject.TargetInstance.Name&"started:"&Now

意思清楚了,对吧?现在,假设屏幕保护程序已结束,这就会导致删除屏幕保护程序进程。为处理这种可能,我们检查__InstanceDeletionEvent类是否有新实例。如果发生属于该类的事件(表示已删除屏幕保护程序进程),我们便回显如下事实-指定的屏幕保护程序在指定时间停止:

Case"__InstanceDeletionEvent"

Wscript.Echo"Screensaver"&objEventObject.TargetInstance.Name&"ended:"&Now

至此您已实现了您的目的。运行此脚本后,会返回类似下面的信息:

ScreensaverScriptCenter.scrstarted:2/9/20069:11:07AM

ScreensaverScriptCenter.scrended:2/9/20069:11:17AM

注意:ScriptCenter.scr到底是什么?下载它,然后自己看。

我们还要补充两件事。第一,最好在Cscript下的命令窗口中运行此脚本,也就是说,要开始监控,请打开命令窗口,然后键入类似下面的命令(当然,具体内容视脚本名称而定):

cscriptscreensaver_monitor.vbs

第二,正如我们前面所指出的,此脚本设计为永远运行。另一方面,什么事都不会永远持续下去,是吧?如果要停止监控,我们只需按Ctrl+C,关闭命令窗口,或者终止CScript.exe进程。记住,脚本专家决不会让您陷于没有出口的无限循环中。(您知道吗:这对我们这的工作真是形容得非常恰当。)

【用vbs记录屏幕保护程序的开始时间和结束时间】相关文章:

用vbs实现更改计算机的说明的代码

用vbs实现取消隐藏文件夹中的所有文件

用vbs确定可移动驱动器的连接时间

利用vbs自动修改ip的代码

用vbs实现配置无人登录计算机时使用的屏幕保护程序

用vbs列出机器上所有能调用的组件

用vbscript实现修改屏幕保护的等待时间长度

用vbs遍历文件并随机显示的脚本

vbs实现的定时提醒你休息的脚本

使用vbscript脚本在表单中进行选择的代码

精品推荐
分类导航