none
同一スクリプトが起動中かどうかの確認方法 RRS feed

  • 質問

  • "scriptName.ps1"という任意のスクリプトを実行する際に、同じ名前を持つスクリプトが既に起動していた場合は処理を中断できるようにしたいです。
    この場合、スクリプトの実行方法を以下のようにすれば、それが実現できました。

    PS C:\>powershell.exe -c "scriptName.ps1"

    上記については以下のコマンドの実行結果から、"scriptName.ps1"という文字列を検索することで実現ができました。

    wmic process where "name = ""powershell.exe"""
    

    しかし、

    PS C:\>./scriptName.ps1
    

    この実行方法では取得できず、Windowsタスクマネージャー上からでも単に"powershell.exe"のみがコマンドラインのフィールドに乗ってくるだけでした。一時ファイルを生成する、といった方法ではなく、同一名のスクリプトが稼働中かどうかを判定する方法は無いものでしょうか。

    よろしくお願いいたします。

    2018年11月8日 9:21

回答

  • mutexを利用するのはいかがでしょうか。

    $mutex = New-Object System.Threading.Mutex -ArgumentList $false, "Global¥$(Split-Path -Path $PSCommandPath -Leaf)"
    
    try
    {
        if (-not $mutex.WaitOne(0, $false)) {
            Write-Warning "既に実行中です。"
            $mutex.Close()
            exit
        }
    }
    catch [System.Threading.AbandonedMutexException]
    {
        Write-Warning "前回の実行は強制終了しました。"
    }
    
    ここに処理を書く
    
    $mutex.ReleaseMutex()
    $mutex.Close()


    2018年11月8日 22:00
    モデレータ

すべての返信

  • mutexを利用するのはいかがでしょうか。

    $mutex = New-Object System.Threading.Mutex -ArgumentList $false, "Global¥$(Split-Path -Path $PSCommandPath -Leaf)"
    
    try
    {
        if (-not $mutex.WaitOne(0, $false)) {
            Write-Warning "既に実行中です。"
            $mutex.Close()
            exit
        }
    }
    catch [System.Threading.AbandonedMutexException]
    {
        Write-Warning "前回の実行は強制終了しました。"
    }
    
    ここに処理を書く
    
    $mutex.ReleaseMutex()
    $mutex.Close()


    2018年11月8日 22:00
    モデレータ
  • これは知りませんでした、無事うまくいきました!
    解決いたしました、ありがとうございました。

    2018年11月9日 1:05