怠日記

写真・金魚・昆虫・プログラミングの趣味を語るサイトです。似たようなことをnoteにも書いたり書いてなかったり。

VBScript - 多重実行を禁止する

こちらの記事で WMI を使ってスクリプトの多重実行を禁止する方法を紹介しました。

しかしこの方法では 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