メイン画像

VBScript - 多重実行を禁止する

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

アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら ことりと さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


酒とアクアリウムが最近の楽しみ。

おすすめの記事