用vbs確定可移動(dòng)驅(qū)動(dòng)器的連接時(shí)間
更新時(shí)間:2007年03月26日 00:00:00 作者:
問:
您好,腳本專家!如何確定 USB 閃存驅(qū)動(dòng)器的連接時(shí)間?
-- PS
答:
您好,PS。是的,我們承認(rèn):腳本專家確實(shí)懶惰。(尤其是在周五,這一天我們必須編寫周一專欄。)可能有一種方法能夠?qū)iT監(jiān)視何時(shí)插入 USB 閃存驅(qū)動(dòng)器。但是,我們找不到這種方法,至少不能馬上找到它。不可否認(rèn),或許我們可能感覺有點(diǎn)困難。但是,我們還是決定編寫一個(gè)腳本,用來告訴您任何可移動(dòng)驅(qū)動(dòng)器與計(jì)算機(jī)連接(或斷開連接)的時(shí)間。我們希望這樣可以為您提供一些附加價(jià)值和靈活性。
嗨,我們并沒有說我們確實(shí)已為您提供了附加價(jià)值和靈活性。我們只是希望自己能夠做到。
實(shí)際上,這是一個(gè)容易編寫的小腳本。另外,它還有一個(gè)優(yōu)點(diǎn),就是能夠在任意版本的 Windows 上運(yùn)行。(最初,我們?cè)?jīng)不加思索地想要使用 Win32_VolumeChangeEvent 類來完成這項(xiàng)任務(wù),但是,該特定 WMI 類只能在 Windows Server 2003 上找到。)
該段代碼如下所示:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceOperationEvent Within 10 Where " _
& "TargetInstance isa 'Win32_LogicalDisk'")
Do While True
Set objEvent = colEvents.NextEvent
If objEvent.TargetInstance.DriveType = 2 Then
Select Case objEvent.Path_.Class
Case "__InstanceCreationEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been added."
Case "__InstanceDeletionEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been removed."
End Select
End If
Loop
是的,它確實(shí)類似于幾天前我們向您展示的屏幕保護(hù)程序監(jiān)視腳本。我們希望重復(fù)使用同一個(gè)腳本為您提供附加價(jià)值和靈活性。(盡管這主要是確保我們能夠節(jié)省精力。)
此腳本首先連接到本地計(jì)算機(jī)上的 WMI 服務(wù)。然后,我們發(fā)出以下查詢:
Set colEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceOperationEvent Within 10 Where " _
& "TargetInstance ISA 'Win32_LogicalDisk'")
這個(gè)查詢起什么作用呢?嗯,這里我們要使用 ExecNotificationQuery 方法來訂閱一組特定的 WMI 事件。什么 WMI 事件?(伙計(jì),您的問題太多了,不是嗎?)在本例中,我們希望在每次更改 Win32_LogicalDisk 類的實(shí)例時(shí)我們都會(huì)得到通知。正如您馬上就能看到的,這些更改將包括:為該類創(chuàng)建一個(gè)新實(shí)例(即,添加一個(gè)可移動(dòng)驅(qū)動(dòng)器)和刪除該類的一個(gè)現(xiàn)有實(shí)例(即,取下一個(gè)可移動(dòng)驅(qū)動(dòng)器)。Within 10 只是意味著每 10 秒鐘我們將檢查一次,看看是否有任何 Win32_LogicalDisk 實(shí)例發(fā)生了變化。
是的,這也意味著,如果您插入了一個(gè)可移動(dòng)驅(qū)動(dòng)器,然后在 6 秒鐘后將其取出,那么我們可能永遠(yuǎn)也不會(huì)知道這件事。如果這是個(gè)問題,那么將 10 改為一個(gè)更小的數(shù)值。也可以將 10 改為一個(gè)更大的數(shù)值。例如,將 10 改為 60,就會(huì)每 60 秒鐘進(jìn)行一次檢查,而不是每 10 秒鐘。
明白了嗎?我們甚至將附加價(jià)值和靈活性加入了代碼自身中!
然后,我們建立一個(gè)不停運(yùn)行的 Do 循環(huán)::
Do While True
接下來我們遇到了下面這行代碼:
Set objEvent = colEvents.NextEvent
正如我們?cè)谏弦粚谥姓f過的,這行代碼將使腳本“中斷”,意思就是腳本將暫停在此行,直到 Win32_LogicalDisk 類發(fā)生變化為止。這種變化(可以是創(chuàng)建了新實(shí)例或者是刪除/修改了一個(gè)現(xiàn)有實(shí)例)將使腳本執(zhí)行 Do 循環(huán)中的其余代碼行。
好問題:剩下那些行代碼究竟要做什么?嗯,首先看一下生成事件的驅(qū)動(dòng)器是否恰好為可移動(dòng)驅(qū)動(dòng)器(至少就 WMI 而言,DriveType 為 2):
If objEvent.TargetInstance.DriveType = 2 Then
如果 DriveType 不是 2,那么我們只能再循環(huán)并等待下一個(gè)事件的發(fā)生。如果 DriveType 等于 2,那么我們使用 Select Case 塊來確定發(fā)生的是哪種類型的事件。我們可通過確定事件的 Class 來執(zhí)行此操作:
Select Case objEvent.Path_.Class
為什么這樣做?有兩個(gè)原因:首先,我們并不關(guān)心現(xiàn)有實(shí)例所發(fā)生的任何變化。例如,我們并不關(guān)心驅(qū)動(dòng)器 C 上的可用驅(qū)動(dòng)器空間是否發(fā)生了變化。如果您看一下 Select Case 代碼,您就會(huì)注意到我們并不去費(fèi)神檢查 __InstanceModificationEvent。為什么不呢?因?yàn)槲覀儾⒉魂P(guān)心 __InstanceModificationEvent(以某種方式修改現(xiàn)有實(shí)例時(shí)生成的事件的類型)。
其次,我們想要對(duì) __InstanceCreationEvent(它會(huì)告訴我們已經(jīng)創(chuàng)建了一個(gè)新驅(qū)動(dòng)器)和 __InstanceDeletionEvent(它會(huì)告訴我們已經(jīng)刪除了一個(gè)現(xiàn)有驅(qū)動(dòng)器)加以區(qū)別。通過確定事件類型,我們可以回顯不同(并相應(yīng))的消息。例如,下面是用于確定是否創(chuàng)建了新驅(qū)動(dòng)器的代碼,如果是,則回顯一條用于指示該結(jié)果的消息:
Case "__InstanceCreationEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been added."
下面是用于通知我們是否刪除了現(xiàn)有驅(qū)動(dòng)器的代碼:
Case "__InstanceDeletionEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been removed."
回顯相應(yīng)的消息后,我們?cè)傺h(huán)并等待下一個(gè)事件的發(fā)生。默認(rèn)情況下,該腳本將永遠(yuǎn)運(yùn)行下去,或者至少在您終止該腳本進(jìn)程之前會(huì)是這樣。先發(fā)生哪種情況就先執(zhí)行哪段代碼。
正如我們說過的,這并不是您真正想要的,但是它確實(shí)能夠達(dá)到這一目的。哦,不要忘了附加價(jià)值和靈活性。這應(yīng)該足以彌補(bǔ)一個(gè)事實(shí),那就是我們并沒有真正回答您的問題。(我們希望我們已經(jīng)解答了該問題的一個(gè)方面。不過這不是您的問題。)
您好,腳本專家!如何確定 USB 閃存驅(qū)動(dòng)器的連接時(shí)間?
-- PS
答:
您好,PS。是的,我們承認(rèn):腳本專家確實(shí)懶惰。(尤其是在周五,這一天我們必須編寫周一專欄。)可能有一種方法能夠?qū)iT監(jiān)視何時(shí)插入 USB 閃存驅(qū)動(dòng)器。但是,我們找不到這種方法,至少不能馬上找到它。不可否認(rèn),或許我們可能感覺有點(diǎn)困難。但是,我們還是決定編寫一個(gè)腳本,用來告訴您任何可移動(dòng)驅(qū)動(dòng)器與計(jì)算機(jī)連接(或斷開連接)的時(shí)間。我們希望這樣可以為您提供一些附加價(jià)值和靈活性。
嗨,我們并沒有說我們確實(shí)已為您提供了附加價(jià)值和靈活性。我們只是希望自己能夠做到。
實(shí)際上,這是一個(gè)容易編寫的小腳本。另外,它還有一個(gè)優(yōu)點(diǎn),就是能夠在任意版本的 Windows 上運(yùn)行。(最初,我們?cè)?jīng)不加思索地想要使用 Win32_VolumeChangeEvent 類來完成這項(xiàng)任務(wù),但是,該特定 WMI 類只能在 Windows Server 2003 上找到。)
該段代碼如下所示:
復(fù)制代碼 代碼如下:
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceOperationEvent Within 10 Where " _
& "TargetInstance isa 'Win32_LogicalDisk'")
Do While True
Set objEvent = colEvents.NextEvent
If objEvent.TargetInstance.DriveType = 2 Then
Select Case objEvent.Path_.Class
Case "__InstanceCreationEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been added."
Case "__InstanceDeletionEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been removed."
End Select
End If
Loop
是的,它確實(shí)類似于幾天前我們向您展示的屏幕保護(hù)程序監(jiān)視腳本。我們希望重復(fù)使用同一個(gè)腳本為您提供附加價(jià)值和靈活性。(盡管這主要是確保我們能夠節(jié)省精力。)
此腳本首先連接到本地計(jì)算機(jī)上的 WMI 服務(wù)。然后,我們發(fā)出以下查詢:
Set colEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceOperationEvent Within 10 Where " _
& "TargetInstance ISA 'Win32_LogicalDisk'")
這個(gè)查詢起什么作用呢?嗯,這里我們要使用 ExecNotificationQuery 方法來訂閱一組特定的 WMI 事件。什么 WMI 事件?(伙計(jì),您的問題太多了,不是嗎?)在本例中,我們希望在每次更改 Win32_LogicalDisk 類的實(shí)例時(shí)我們都會(huì)得到通知。正如您馬上就能看到的,這些更改將包括:為該類創(chuàng)建一個(gè)新實(shí)例(即,添加一個(gè)可移動(dòng)驅(qū)動(dòng)器)和刪除該類的一個(gè)現(xiàn)有實(shí)例(即,取下一個(gè)可移動(dòng)驅(qū)動(dòng)器)。Within 10 只是意味著每 10 秒鐘我們將檢查一次,看看是否有任何 Win32_LogicalDisk 實(shí)例發(fā)生了變化。
是的,這也意味著,如果您插入了一個(gè)可移動(dòng)驅(qū)動(dòng)器,然后在 6 秒鐘后將其取出,那么我們可能永遠(yuǎn)也不會(huì)知道這件事。如果這是個(gè)問題,那么將 10 改為一個(gè)更小的數(shù)值。也可以將 10 改為一個(gè)更大的數(shù)值。例如,將 10 改為 60,就會(huì)每 60 秒鐘進(jìn)行一次檢查,而不是每 10 秒鐘。
明白了嗎?我們甚至將附加價(jià)值和靈活性加入了代碼自身中!
然后,我們建立一個(gè)不停運(yùn)行的 Do 循環(huán)::
Do While True
接下來我們遇到了下面這行代碼:
Set objEvent = colEvents.NextEvent
正如我們?cè)谏弦粚谥姓f過的,這行代碼將使腳本“中斷”,意思就是腳本將暫停在此行,直到 Win32_LogicalDisk 類發(fā)生變化為止。這種變化(可以是創(chuàng)建了新實(shí)例或者是刪除/修改了一個(gè)現(xiàn)有實(shí)例)將使腳本執(zhí)行 Do 循環(huán)中的其余代碼行。
好問題:剩下那些行代碼究竟要做什么?嗯,首先看一下生成事件的驅(qū)動(dòng)器是否恰好為可移動(dòng)驅(qū)動(dòng)器(至少就 WMI 而言,DriveType 為 2):
If objEvent.TargetInstance.DriveType = 2 Then
如果 DriveType 不是 2,那么我們只能再循環(huán)并等待下一個(gè)事件的發(fā)生。如果 DriveType 等于 2,那么我們使用 Select Case 塊來確定發(fā)生的是哪種類型的事件。我們可通過確定事件的 Class 來執(zhí)行此操作:
Select Case objEvent.Path_.Class
為什么這樣做?有兩個(gè)原因:首先,我們并不關(guān)心現(xiàn)有實(shí)例所發(fā)生的任何變化。例如,我們并不關(guān)心驅(qū)動(dòng)器 C 上的可用驅(qū)動(dòng)器空間是否發(fā)生了變化。如果您看一下 Select Case 代碼,您就會(huì)注意到我們并不去費(fèi)神檢查 __InstanceModificationEvent。為什么不呢?因?yàn)槲覀儾⒉魂P(guān)心 __InstanceModificationEvent(以某種方式修改現(xiàn)有實(shí)例時(shí)生成的事件的類型)。
其次,我們想要對(duì) __InstanceCreationEvent(它會(huì)告訴我們已經(jīng)創(chuàng)建了一個(gè)新驅(qū)動(dòng)器)和 __InstanceDeletionEvent(它會(huì)告訴我們已經(jīng)刪除了一個(gè)現(xiàn)有驅(qū)動(dòng)器)加以區(qū)別。通過確定事件類型,我們可以回顯不同(并相應(yīng))的消息。例如,下面是用于確定是否創(chuàng)建了新驅(qū)動(dòng)器的代碼,如果是,則回顯一條用于指示該結(jié)果的消息:
Case "__InstanceCreationEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been added."
下面是用于通知我們是否刪除了現(xiàn)有驅(qū)動(dòng)器的代碼:
Case "__InstanceDeletionEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been removed."
回顯相應(yīng)的消息后,我們?cè)傺h(huán)并等待下一個(gè)事件的發(fā)生。默認(rèn)情況下,該腳本將永遠(yuǎn)運(yùn)行下去,或者至少在您終止該腳本進(jìn)程之前會(huì)是這樣。先發(fā)生哪種情況就先執(zhí)行哪段代碼。
正如我們說過的,這并不是您真正想要的,但是它確實(shí)能夠達(dá)到這一目的。哦,不要忘了附加價(jià)值和靈活性。這應(yīng)該足以彌補(bǔ)一個(gè)事實(shí),那就是我們并沒有真正回答您的問題。(我們希望我們已經(jīng)解答了該問題的一個(gè)方面。不過這不是您的問題。)
相關(guān)文章
用vbs實(shí)現(xiàn)的確定共享文件夾的本地路徑?
用vbs實(shí)現(xiàn)的確定共享文件夾的本地路徑?...2007-03-03WMI StdRegProv 通過wmi操作注冊(cè)表的vbscript實(shí)現(xiàn)代碼 (本地或遠(yuǎn)程)
WMI StdRegProv 通過wmi操作注冊(cè)表的vbscript實(shí)現(xiàn)代碼 (本地或遠(yuǎn)程),需要的朋友可以參考下。2011-12-12使用 iisweb.vbs 刪除網(wǎng)站的方法(支持批量刪除)
有時(shí)候我們需要批量刪除網(wǎng)站,如果一個(gè)一個(gè)手工刪除肯定太慢了,這里分享個(gè)命令,通過iisweb.vbs批量刪除網(wǎng)站2014-07-07用VBS寫的VBSCRIPT代碼格式化工具VbsBeautifier
這篇文章主要介紹了用VBS寫的VBSCRIPT代碼格式化工具VbsBeautifier,需要的朋友可以參考下2014-09-09使用 Iisext.vbs 刪除 Web 服務(wù)擴(kuò)展文件的方法
這篇文章主要介紹了如何使用 iisext.vbs 從本地或遠(yuǎn)程計(jì)算機(jī)上刪除 Web 服務(wù)擴(kuò)展文件,需要的朋友可以參考下2014-07-07msxml3.dll 錯(cuò)誤 80070005 拒絕訪問
msxml3.dll 錯(cuò)誤 80070005拒絕訪問。 解決辦法: 賦予程序所在文件夾 internet 來賓帳號(hào)(IUSR_WEB)可寫。2011-01-01