トップ回答者
同一スクリプトが起動中かどうかの確認方法

質問
-
"scriptName.ps1"という任意のスクリプトを実行する際に、同じ名前を持つスクリプトが既に起動していた場合は処理を中断できるようにしたいです。
この場合、スクリプトの実行方法を以下のようにすれば、それが実現できました。PS C:\>powershell.exe -c "scriptName.ps1"
上記については以下のコマンドの実行結果から、"scriptName.ps1"という文字列を検索することで実現ができました。
wmic process where "name = ""powershell.exe"""
しかし、
PS C:\>./scriptName.ps1
この実行方法では取得できず、Windowsタスクマネージャー上からでも単に"powershell.exe"のみがコマンドラインのフィールドに乗ってくるだけでした。一時ファイルを生成する、といった方法ではなく、同一名のスクリプトが稼働中かどうかを判定する方法は無いものでしょうか。
よろしくお願いいたします。
回答
-
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()
- 編集済み 牟田口大介Moderator 2018年11月8日 22:00
- 回答としてマーク Fuzitaman 2018年11月9日 1: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()
- 編集済み 牟田口大介Moderator 2018年11月8日 22:00
- 回答としてマーク Fuzitaman 2018年11月9日 1:00