初心者ですが、助けてください。プロセスが実行中かどうかを確認し、実行中でない場合は起動するスクリプトを作成しようとしています。プロセスが実行中の場合は、何も実行しません。これまでに次の方法を思いつきましたが、すでに実行中かどうかに関係なく、プロセスの新しいインスタンスが開始されます。どなたか助けていただければ幸いです。
$Prog = "C:\utilities\prog.exe"
$Running = Get-Process prog -ErrorAction SilentlyContinue
$Start = ([wmiclass]"win32_process").Create($Prog)
if($Running -eq $null)
{$Start}
else
{}
ベストアンサー1
まず、あなたのコードのどこが間違っているのか見てみましょう。あなたのコードでは、プログラムがすでに実行されているかどうかを評価する前にプロセスが作成されています。
$Prog = "C:\utilities\prog.exe"
$Running = Get-Process prog -ErrorAction SilentlyContinue
$Start = ([wmiclass]"win32_process").Create($Prog) # the process is created on this line
if($Running -eq $null) # evaluating if the program is running
{$Start}
コード内でさらに評価する必要があるコード ブロックを {} (スクリプト ブロック) で囲むことで作成できます。
$Prog = "C:\utilities\prog.exe"
$Running = Get-Process prog -ErrorAction SilentlyContinue
$Start = {([wmiclass]"win32_process").Create($Prog)}
if($Running -eq $null) # evaluating if the program is running
{& $Start} # the process is created on this line
ただし、問題を解決するための短いワンライナーを探している場合は、次のようになります。
if (! (ps | ? {$_.path -eq $prog})) {& $prog}