しかしこの方法では Enter キーの連打等によって短時間に複数実行された場合、どちらも実行中と判定されてしまう問題がありました。
今回は WMI ではなく一時ファイルを使って、スクリプトの多重実行を禁止してみます。
サンプルスクリプト
一時ファイルを作成できたらメインの処理を実行、作成できなければエラーメッセージを表示して終了します。
With CreateObject("Scripting.FileSystemObject") Dim lockFilePath lockFilePath = .BuildPath( .GetSpecialFolder(2), WScript.ScriptName & ".lock" ) '一時ファイルを作れたらメイン処理を実行 '作れなければスクリプトを終了 On Error Resume Next With .OpenTextFile(lockFilePath, 2, True) '一時ファイルを作れなければスクリプトを終了する If Err.Number <> 0 Then WScript.Echo "Error 1 # " & CStr(Err.Number) & " : " & Err.Description WScript.Quit 1 End If 'TODO: ここにメイン処理を書く If Err.Number <> 0 Then 'TODO: メイン処理のエラー処理を書く 'TODO: 後続処理で一時ファイルを削除するので、ここでは Quit しないこと End If End With On Error GoTo 0 '一時ファイルを削除 On Error Resume Next .DeleteFile lockFilePath, True If Err.Number <> 0 Then WScript.Echo "Error 2 # " & CStr(Err.Number) & " : " & Err.Description WScript.Quit 1 End If On Error GoTo 0 End With
サンプルスクリプトの説明
まずは一時ファイルのパスを設定します。
Temp フォルダ配下にスクリプト名+ “.lock” の名前とします。
lockFilePath = .BuildPath( .GetSpecialFolder(2), WScript.ScriptName & ".lock" )続けて一時ファイルを作ります。
作成に成功した場合(→スクリプトが実行されていないとき)はメイン処理を行います。
With .OpenTextFile(lockFilePath, 2, True) '一時ファイルを作れなければスクリプトを終了する If Err.Number <> 0 Then WScript.Echo "Error 1 # " & CStr(Err.Number) & " : " & Err.Description WScript.Quit 1 End If 'TODO: ここにメイン処理を書く
最後に一時ファイルを削除します。
*消さなくても特に問題はありませんが念のため。
.DeleteFile lockFilePath, True