あとから起動したプログラムが「自分と同じ名前のプログラムが起動していたら終了する」という方法をとるのが一般的な気がします。
この場合、下記サイトが参考になります。
⇒アプ研
あとから起動したプログラムが「既に動いているプログラムを終了させる」には、プロセスを見つけてKILLするような形になると思います。
この場合、下記サイトが参考になります。
⇒WMI Fun
⇒yozdaさんのブログ
⇒maruton's memorandum
しかし、自分自信も同名のプログラムとして検出してしまうので、自プロセスを特定していないと自分自身もKILLしてしまうことになります。
この自プロセスの特定という部分が難しいということもあるので、どちらでもよいのであれば前者をお勧めします。
サンプル
以下は上記サイトのコードを組み合わせた、KILLするサンプルです。
Option Explicit
Dim wmiLocator
Dim wmiService
Dim objEnumerator
Dim strQuery
Dim objProcess
strQuery = "Select * FROM Win32_Process WHERE (Caption = 'wscript.exe' OR Caption = 'cscript.exe') AND " & _
" CommandLine LIKE '%" & WScript.ScriptName & "%'"
Set wmiLocator = CreateObject("WbemScripting.SWbemLocator")
Set wmiService = wmiLocator.ConnectServer
Set objEnumerator = wmiService.ExecQuery(strQuery)
Dim iCnt
iCnt = 0
If objEnumerator.Count > 1 Then
msgbox "同じスクリプトが実行されています。"
For Each objProcess In objEnumerator
iCnt = iCnt + 1
If iCnt = objEnumerator.Count then
'最後に見つけたプロセスはKILLしない
Else
'プロセスを終了する。
objProcess.Terminate
MsgBox "PIDが" & CStr(objProcess.ProcessId) & "のプロセスを終了しました。" & iCnt & "/" & objEnumerator.Count
End If
Next
Else
msgbox "他には起動していません。"
End If
msgbox "処理終了"
自プロセスの特定はしておらず、同名のプログラムの中で最後に見つけたものだけKILLしないようになっています。
このため、条件次第でうまく消されないものが出てきたりすると思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/12 07:27
2016/07/12 11:45