用vbs確定抽取式磁碟機的連線時間

來源:互聯網
上載者:User

問:
您好,指令碼專家!如何確定 USB 快閃記憶體磁碟機的連線時間?
-- PS
答:
您好,PS。是的,我們承認:指令碼專家確實懶惰。(尤其是在周五,這一天我們必須編寫周一專欄。)可能有一種方法能夠專門監視何時插入 USB 快閃記憶體磁碟機。但是,我們找不到這種方法,至少不能馬上找到它。不可否認,或許我們可能感覺有點困難。但是,我們還是決定編寫一個指令碼,用來告訴您任何抽取式磁碟機與電腦串連(或中斷連線)的時間。我們希望這樣可以為您提供一些附加價值和靈活性。
嗨,我們並沒有說我們確實已為您提供了附加價值和靈活性。我們只是希望自己能夠做到。
實際上,這是一個容易編寫的小指令碼。另外,它還有一個優點,就是能夠在任意版本的 Windows 上運行。(最初,我們曾經不加思索地想要使用 Win32_VolumeChangeEvent 類來完成這項任務,但是,該特定 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

是的,它確實類似於幾天前我們向您展示的螢幕保護裝置程式監視指令碼。我們希望重複使用同一個指令碼為您提供附加價值和靈活性。(儘管這主要是確保我們能夠節省精力。)
此指令碼首先串連到本機電腦上的 WMI 服務。然後,我們發出以下查詢:
Set colEvents = objWMIService.ExecNotificationQuery _
("Select * From __InstanceOperationEvent Within 10 Where " _
& "TargetInstance ISA 'Win32_LogicalDisk'")
這個查詢起什麼作用呢?嗯,這裡我們要使用 ExecNotificationQuery 方法來訂閱一組特定的 WMI 事件。什麼 WMI 事件?(夥計,您的問題太多了,不是嗎?)在本例中,我們希望在每次更改 Win32_LogicalDisk 類的執行個體時我們都會得到通知。正如您馬上就能看到的,這些更改將包括:為該類建立一個新執行個體(即,添加一個抽取式磁碟機)和刪除該類的一個現有執行個體(即,取下一個抽取式磁碟機)。Within 10 只是意味著每 10 秒鐘我們將檢查一次,看看是否有任何 Win32_LogicalDisk 執行個體發生了變化。
是的,這也意味著,如果您插入了一個抽取式磁碟機,然後在 6 秒鐘後將其取出,那麼我們可能永遠也不會知道這件事。如果這是個問題,那麼將 10 改為一個更小的數值。也可以將 10 改為一個更大的數值。例如,將 10 改為 60,就會每 60 秒鐘進行一次檢查,而不是每 10 秒鐘。
明白了嗎?我們甚至將附加價值和靈活性加入了代碼自身中!
然後,我們建立一個不停啟動並執行 Do 迴圈::
Do While True
接下來我們遇到了下面這行代碼:
Set objEvent = colEvents.NextEvent
正如我們在上一專欄中說過的,這行代碼將使指令碼“中斷”,意思就是指令碼將暫停在此行,直到 Win32_LogicalDisk 類發生變化為止。這種變化(可以是建立了新執行個體或者是刪除/修改了一個現有執行個體)將使指令碼執行 Do 迴圈中的其餘程式碼。
好問題:剩下那些行代碼究竟要做什嗎?嗯,首先看一下建置事件的磁碟機是否恰好為抽取式磁碟機(至少就 WMI 而言,DriveType 為 2):
If objEvent.TargetInstance.DriveType = 2 Then
如果 DriveType 不是 2,那麼我們只能再迴圈並等待下一個事件的發生。如果 DriveType 等於 2,那麼我們使用 Select Case 塊來確定發生的是哪種類型的事件。我們可通過確定事件的 Class 來執行此操作:
Select Case objEvent.Path_.Class
為什麼這樣做?有兩個原因:首先,我們並不關心現有執行個體所發生的任何變化。例如,我們並不關心磁碟機 C 上的可用磁碟機空間是否發生了變化。如果您看一下 Select Case 代碼,您就會注意到我們並不去費神檢查 __InstanceModificationEvent。為什麼不呢?因為我們並不關心 __InstanceModificationEvent(以某種方式修改現有執行個體時產生的事件的類型)。
其次,我們想要對 __InstanceCreationEvent(它會告訴我們已經建立了一個新磁碟機)和 __InstanceDeletionEvent(它會告訴我們已經刪除了一個現有磁碟機)加以區別。通過確定事件類型,我們可以回顯不同(並相應)的訊息。例如,下面是用於確定是否建立了新磁碟機的代碼,如果是,則回顯一條用於指示該結果的訊息:
Case "__InstanceCreationEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been added."
下面是用於通知我們是否刪除了現有磁碟機的代碼:
Case "__InstanceDeletionEvent"
Wscript.Echo "Drive " & objEvent.TargetInstance.DeviceId & _
" has been removed."
回顯相應的訊息後,我們再迴圈並等待下一個事件的發生。預設情況下,該指令碼將永遠運行下去,或者至少在您終止該指令碼進程之前會是這樣。先發生哪種情況就先執行哪段代碼。
正如我們說過的,這並不是您真正想要的,但是它確實能夠達到這一目的。哦,不要忘了附加價值和靈活性。這應該足以彌補一個事實,那就是我們並沒有真正回答您的問題。(我們希望我們已經解答了該問題的一個方面。不過這不是您的問題。)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.