VBScript(WSH) の WScript.CreateObject では、作成したオブジェクトのイベントを受け付ける関数を定義する事ができます。過去、ほとんどそのようなサンプルは現実には無かったのですが、WMI では少なくともタイマー処理として利用可能です。CreateObject メソッドで strPrefix 引数を指定すると、接続されたオブジェクトが作成されます。 これは、オブジェクトのイベントを同期させる場合に便利です。オブジェクトの出力インターフェイスは、オブジェクト作成後にスクリプト ファイルに接続されます。 イベント処理関数は、このプリフィックスとイベント名を組み合わせた名前になります。オブジェクト作成時に strPrefix 引数を指定しなかった場合は、ConnectObject メソッドを使ってオブジェクトのイベントを同期させることができます。オブジェクトがイベントを発行すると、WSH は strPrefix + イベント名という形式の名前を持つサブルーチンを呼び出します。 たとえば、strPrefix が MYOBJ であり、オブジェクトが OnBegin というイベントを発行した場合、Windows Script Host はスクリプト内の MYOBJ_OnBegin という名前のサブルーチンを呼び出しますタイマー処理
' ******************************************************************** ' このセクションは、cscript.exe で処理を強制させるものです ' ******************************************************************** str = WScript.FullName str = Right( str, 11 ) str = Ucase( str ) if str <> "CSCRIPT.EXE" then str = WScript.ScriptFullName Set WshShell = CreateObject( "WScript.Shell" ) Call WshShell.Run( "cmd.exe /c cscript.exe """ & str & """ & pause", 3 ) WScript.Quit end if ' ******************************************************************** ' 秒単位のログを表示するかどうかのフラグです ' ******************************************************************** Dim Disp : Disp = True ' False にすると、秒単位の表示はしなくなります ' ******************************************************************** ' WMI のイベントの定義 ' ******************************************************************** Set SINK = WScript.CreateObject("WbemScripting.SWbemSink","SINK_") Set objWMIService = GetObject("winmgmts:\\.\root\cimv2") objWMIService.ExecNotificationQueryAsync _ SINK, _ "SELECT * FROM __InstanceModificationEvent " & _ "WHERE TargetInstance ISA 'Win32_LocalTime'" Wscript.Echo "タイマー処理を開始します" ' ******************************************************************** ' 停止する為のイベントの定義 ' ******************************************************************** Set objMonitor = objWMIService.ExecNotificationQuery( _ "select * from __InstanceModificationEvent " & _ "where TargetInstance isa 'Win32_LocalTime' " & _ " and TargetInstance.Year = 0" _ ) ' Wscript.Echo "TargetInstance.Year は 0 にならないので、次の行より後の処理は実行されません" Set objLatestEvent = objMonitor.NextEvent Wscript.Echo "ここは実行されません" ' ******************************************************************** ' この処理は、WbemScripting.SWbemSink から呼び出されます ' ******************************************************************** Sub SINK_OnObjectReady(objLatestEvent, objAsyncContext) ' 10秒毎の処理 if objLatestEvent.TargetInstance.Second MOD 10 = 0 then ' ここが 10秒毎に呼び出されます Wscript.Echo "秒の余りが 0 の場合にここが実行されます" Wscript.Echo "分や時間を使用すると、長いスパンの定期処理に使えます" end if if Disp then ' 秒単位に呼び出されるこのルーチンで毎回表示 Wscript.Echo "Time: " & _ objLatestEvent.TargetInstance.Hour & ":" & _ objLatestEvent.TargetInstance.Minute & ":" & _ objLatestEvent.TargetInstance.Second end if End Sub
VBScriptドキュメント
|
【VBS + WMIの最新記事】
- Windows10 : VBScript : WMI を使用してレジストリ情報より、shell: を使ってフォルダを開く(実行できる)コマンドラインの一覧ボタンを表示する Html Applicati..
- VBScript : スクリプトを終了しないようにする
- 64ビット PC の VBScript で 32ビット ODBC ドライバの一覧を取得する( ODBC 接続のドライバ文字列を正しく取得したい )
- VBScript + WMI : ファイルの状態の監視
- VBScript : WMI と NT Provider(ADSI) をそれぞれ使用して、共有を『登録』『一覧』『削除』するサンプル
- VBSCript+WMI : コンピュータ上のファイル検索と詳細情報
- VBScript : OSのバージョンを取得
- VBS : コンピュータから c$ 共有を一時的に削除
- VBS : 指定した HOST 名を現在の IP アドレスで HOSTS ファイルに登録するスクリプト
【VBScript関連のカテゴリ】