Windows/WSH

Last-modified: 2010-02-01 (月) 23:29:09

WSHとは?

VBScriptランゲージリファレンス

ProcessIDを取得する

Windowsでのプロセスの無応答に対応するための方式を検討してみた。

最もお手軽は以下の方法かな?

  • 前提条件
    • 実行するWSHは1プロセスのみ。
    • cscriptを使用して起動する。
  • 方式
    • スクリプトの中で自分のプロセスIDを取得し、ファイルを生成する。ファイル名をプロセスIDにする。
    • スクリプトが終了した際に、ファイルを削除する。
    • 監視スクリプトを作成し、ファイルが存在した場合、該当するPIDでファイルがcscript.exeが存在するかチェックする。
    • PIDが存在した場合は、何らかの要因で無応答になっているものとし、削除を行う。
    • 自分をcscript.exeで呼び出すと自分を止めちゃうので、要検討。wscript.exeかな。

ソースコード(vbscript)

■プロセスIDを取得する

Dim objService
Set objService = GetObject("winmgmts:")
Dim Processes
Set Processes = objService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'cscript.exe'")
Dim proc
For Each proc in Processes
   WScript.Echo proc.ProcessId
   ''WScript.Echo proc.Name & vbTab & proc.ProcessId
Next

 
■プロセスPIDの存在チェック
上記、SELECT * FROM Win32_Processes WHERE Name = 'cscript.exe'で、Name = 'xxx'の箇所を
SELECT * FROM Win32_Processes WHERE ProcessId = '<PID>'
にすればよい。
 
■プロセスを停止する。
Win32_Process ClassのTerminated Methodが使えそうです。
無応答のプロセスをこれでkill出来るのかはよくわかりませんが。。。調査中。
→Sleepプロセスの停止に成功!(WScript.Sleep(t)でスリープさせた実行中のcscript.exeプロセスを停止させることが出来ました)(2009/05/27)

For Each proc in Processes
   If proc.Name = "cscript.exe" THen
      proc.Terminate()
   End If
Next