dポイントプレゼントキャンペーン実施中!

PowerShell初心者です。
自身で起動中のスクリプトと同じコマンドで実行しているプロセスを検知し、他方のプロセスをkillしようと考えております。要は二重起動のチェックをしたいです。

現在コマンドラインで確認しているのですがどうもうまくいきません。
やろうとしている操作は以下です。

(1)ファイルにプロセス情報を出力。
PS C:\> $tempfile = "C:\pswork\servicemon\temp.log"

PS C:\> Get-WmiObject win32_process `
| select Name,
ProcessId,
CommandLine `
| sort Name `
| Format-Table -AutoSize `
| Out-File -FilePath $tempfile -width 1000

(2)自分のPID以外のプロセス情報を取得

PS C:\> $mypid = $PID

PS C:\> $killpidtmp = Get-Content $tempfile | Select-String -Pattern ".*powershell.exe.*svmon131_loop.*" |Select-String -NotMatch -Pattern "\s$mypid\s"

PS C:\> echo $killpidtmp

powershell.exe 2024 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -Command C:\pswork\servicemon\svmon131_loop.ps1



(3)splitでプロセス番号のみを取得。
PS C:\> $killpid = echo $killpidtmp |% {$($_-split(" "))[1]}

PS C:\> echo $killpid

★ここがうまく取得できません。空白しか取得できていません。

(4)最終的には取得したPIDでプロセスを終了。
PS C:\pswork\servicemon> Stop-Process -ID $killpid

Bシェルで同様のスクリプトがあったので、それを参考にPowerShellで書こうとしているので、
そもそも無理があるのかもしれないかと考えています。
上記の方法でなくてもよいので、二重起動のチェックと該当プロセスの停止で参考となる情報があれば教えて頂きたいです。

A 回答 (1件)

Get-WmiObject win32_process |


Where {$_.Name -eq "powershell.exe" -and $_.CommandLine -match "svmon131_loop" -and $_.ProcessId -ne $PID} |
ForEach {Stop-Process -ID $_.ProcessId}
という感じでどうでしょう?

(1)すべてのプロセスを列挙
(2)(1)のうち、「Name="powershell.exe" AND CommandLineが正規表現"svmon131_loop"にマッチ AND ProcessIdが自分以外」を満たすプロセスを抽出
(3)(2)で抽出したプロセスに対して、各々Stop-Processを実行
    • good
    • 0
この回答へのお礼

出来ました!ありがとうございます!
なるほどー
大変、勉強になりました。

お礼日時:2014/02/26 10:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!