用vbs記錄螢幕保護程式的開始時間和結束時間

2022-09-24 09:36:10 字數 3989 閱讀 4064

問:

您好,指令碼專家!如何記錄螢幕保護程式的開始時間和結束時間?

-- js

答: 您好,js。您知道,一位指令碼專家(嘿,誰說「肯定是 greg」?)年紀大得記得螢幕保護程式剛出現的日子。那時,這類指令碼毫無意義。畢竟,螢幕保護程式啟動後,每個人都神魂顛倒,從未想過讓它結束。事實上,作為計算機支援人員的這位指令碼專家首先必須做的一件事就是在每個人的桌面上建立快捷方式,使他們能夠隨時啟動「飛轉的小烤爐」。

那時人們很容易得到快樂。

啊,但是活在過去沒有意義,對吧?在今天的現代社會中,顯然不僅需要停止螢幕保護程式,還需要記錄停止的時間。明確這一點後,讓我們來看一看下面這個 wmi 事件監控指令碼,它會跟蹤螢幕保護程式的每次啟動和停止:

複製** **如下:

strcomputer = "." 

set objwmiservice = getobject("whontzvfsjinmgmts:\\" & strcomputer & "\root\cimv2") 

set objeventsource = objwmiservice.execnotificationquery _ 

("select * from __instanceoperationevent within 5 where targetinstance isa 'win32_process'") 

do while true 

set程式設計客棧 objeventobject = objeventsource.nextevent() 

if right(objeventobject.targetinstance.name, 4) = ".scr" then 

select case objeventobject.path_.class 

case "__instancecreationevent" 

wscript.echo "screens**er " & objeventobject.targetinstance.name & _ 

" started: " & now 

case "__instancedeletionevent" 

wscript.echo "screens**er " & objeventobject.targetinstance.name & _ 

" ended: " & now 

end select 

end if 

loop 

它看起來的確有點複雜,不是嗎?但是別慌:就設計而言,wmi 事件指令碼總是看起來有點複雜。幸運的是,這些指令碼只是看起來複雜;您會看到,這些指令碼實際上並不那麼難理解。

注意:好吧,我們最好對最後一句陳述加以限定:只要您了解 wmi 事件構成的基本思想,就不那麼難理解。如果您還不了解,最好花點時間看看指令碼編寫第 2 周網路廣播。這個網路廣播將為您提供了理解今天專欄文章所需的所有背景資訊。

好主意!儘管可能沒有有助於搞清楚我們的某一篇專欄文章的資訊,但至少有助於搞清楚這個指令碼**的意思。

這個特定指令碼的開始是以歷史悠久的方式連線到本地計算機上的 wmi 服務。通常到這裡,我們要執行 wmi 查詢以返回資訊。正如您所看到的,在這個指令碼中我們也要這麼做,只是查詢看起來有點不同:

set objeventsource = objwmiservice.execnotificationquery _

("select * from __instanceoperationevent within 5 where targetinstance isa '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 迴圈:

do while true

句子的語法確實有點怪異,但這個語法卻能夠使指令碼不停執行,並且不停監控程序的建立、刪除和修改,直到終止指令碼或重新啟動計算機。如果沒有這樣的迴圈,指令碼會通知我們螢幕保護程式何時啟動,但是,隨後指令碼就會結束。結果,我們永遠也不會得到螢幕保護程式何時結束的通知。

在迴圈內,我們首先要做的就是執行下面這行**:

set objeventobject = objeventsource.nextevent()

我們所做的是告訴指令碼等待,直到下乙個我們所關心的事件發生。換句話說,指令碼將停留在此行**上,直到有程序被建立、刪除或修改。假設程序始終不變,假設我們始終不建立、刪除或修改程序。在這種情況下,指令碼就會永遠停在這兒,耐心等待。以防萬一。

現在,我們知道您正在想什麼。您正在想:「嗨,稍等一下。我們只關心螢幕保護程式。microsoft word 也在程序中執行。如果我們啟動 microsoft word,從而建立 winword.exe 程序的新例項,那不也會觸發通知嗎?」 

您說對了:會觸發通知。接下來這行**就用來解決這個問題。啟動 word(或者任何可執行檔案,就這一點而言)確實都會發出通知。但我們可以使用下面這行**解決這個問題:

if right(objeventobject.targetinstance.name, 4) = ".scr" then

在這裡,我們使用 right 函式檢查觸發通知的程序的名稱。如果名稱中最右側的四個字元等於 .scr,我們便假定正在處理的是螢幕保護程式,因為螢幕保護程式的名稱類似 marquee.scr。如果名稱中的最後四個字元不是 .scr,我們便只是迴圈一次,然後等待下乙個事件發生。

那麼,如果最後四個字元是 .scr 會怎樣?在這種情況下,我們只關心兩種可能:螢幕保護程式啟動或螢幕保護程式結束。(我們並不關心是否有人修改螢幕保護程式的屬性。)為處理這兩種可能,我們設定乙個 select case 塊,用於檢查事件例項的 class:

select case objeventobject.path_.class

如果 class 等於 __instancecreationevent,則意味著已建立新程序(即新螢幕保護程式)。在第乙個 case 語句中,我們檢查 class 是否等於 __instancecreationevent。如果等於,我們便回顯如下事實:特定螢幕保護程式(使用程序名稱表示)在特定時間(使用 vbscript 函式 now)啟動:

case "__instancecreationevent"

wscript.echo "screens**er " & objeventobject.targetinstance.name & " started: " & now

意思清楚了,對吧?現在,假設螢幕保護程式已結束,這就會導致刪除螢幕保護程式程序。為處理這種可能,我們檢查 __instancedeletionevent 類是否有新例項。如果發生屬於該類的事件(表示已刪除螢幕保護程式程序),我們便回顯如下事實 - 指定的螢幕保護程式在指定時間停止:

case "__instancedeletionevent"

wscript.echo "screens**er " & objeventobject.targetinstance.name & " ended: " & now

php 根據年份獲取每週的開始時間和結束時間

原本覺得這個函式是在網上能隨便就能找到的,誰知道千篇一律的都是那個函式,而且發現如果今年是2018,那麼2018至後面的年份根本就得不各週的開始和結束時間戳 陣列。所以自己寫了!但是演算法方面應該可以優化!如下直接甩函式 如果可以優化,請幫忙給出優化的函式,謝謝!function get week ...

比較選擇的開始時間和結束時間的大小

比較選擇的開始時間和結束時間的大小 bool comparisonstring nsstring str1 andstring nsstring str2 nsstring datestr 2015 12 31 01 01 01 傳入時間 1.獲得時間 nsdate senddate nsdate ...

oracle獲取上一旬的開始時間和結束時間的函式

獲取上旬開始時間 create or replace function fd lastxunstart rq in date return string is refstr varchar2 50 v rq date begin 獲取上一旬的日期 v rq trunc rq select case ...