アプリケーションがバッチ (cmd) ファイルから実行されているかどうかを確認するにはどうすればよいですか?
プログラムが既に実行されている場合、別のインスタンスを起動する必要はありません。(アプリを変更して単一インスタンスのみにすることはできません。)
また、アプリケーションは任意のユーザーとして実行できます。
アプリケーションがバッチ (cmd) ファイルから実行されているかどうかを確認するにはどうすればよいですか?
プログラムが既に実行されている場合、別のインスタンスを起動する必要はありません。(アプリを変更して単一インスタンスのみにすることはできません。)
また、アプリケーションは任意のユーザーとして実行できます。
これが私がそれを解決した方法です:
tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log
FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end
start notepad.exe
:end
del search.log
上記は、まだ実行されていない場合、メモ帳を開きます。
編集:タスクリストから非表示になっているアプリケーションは検索されないことに注意してください。これらは自動的に非表示になるため、これには、別のユーザーとして実行されているスケジュールされたタスクが含まれます。
Windows では、Windows Management Instrumentation (WMI) を使用して、指定したコマンド ラインでアプリが起動されないようにすることができます。次に例を示します。
wmic process where (name="nmake.exe") get commandline | findstr /i /c:"/f load.mak" /c:"/f build.mak" > NUL && (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% & exit /b 1)
Program Files\PV にインストールされたhttp://www.teamcti.com/pview/prcview.htmのPV.exe を次のようなバッチ ファイルと共に使用します。
@echo off
PATH=%PATH%;%PROGRAMFILES%\PV;%PROGRAMFILES%\YourProgram
PV.EXE YourProgram.exe >nul
if ERRORLEVEL 1 goto Process_NotFound
:Process_Found
echo YourProgram is running
goto END
:Process_NotFound
echo YourProgram is not running
YourProgram.exe
goto END
:END
Matt Lacey によって提供された回答は、Windows XP で機能します。ただし、Windows Server 2003 では、次の行
tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log
戻り値
情報: 指定された条件に一致するタスクは実行されていません。
これは、プロセスの実行中に読み取られます。
私はバッチスクリプトの経験が豊富ではないので、私の解決策は、ファイル内のプロセス名を検索しsearch.log
、結果を別のファイルに送り込んで出力を検索することです。
tasklist /FI "IMAGENAME eq notepad.exe" /FO CSV > search.log
FINDSTR notepad.exe search.log > found.log
FOR /F %%A IN (found.log) DO IF %%~zA EQU 0 GOTO end
start notepad.exe
:end
del search.log
del found.log
これが他の誰かに役立つことを願っています。
組み込みの CMD でこれを行う方法はわかりませんが、 grepがある場合は、次のことを試すことができます。
tasklist /FI "IMAGENAME eq myApp.exe" | grep myApp.exe
if ERRORLEVEL 1 echo "myApp is not running"
Matt (2008-10-02)から提供されたスクリプトを使用しました。私が問題を抱えた唯一のことは、search.log
ファイルが削除されないことでした。cd
プログラムを開始するために別の場所に行かなければならなかったので、私は期待しています。cd
BATファイルと現在の場所に戻りますがsearch.log
、それでも削除されません。そこでsearch.log
、最後ではなく最初にファイルを削除することで解決しました。
del search.log
tasklist /FI "IMAGENAME eq myprog.exe" /FO CSV > search.log
FOR /F %%A IN (search.log) DO IF %%-zA EQU 0 GOTO end
cd "C:\Program Files\MyLoc\bin"
myprog.exe myuser mypwd
:end
vtrzの回答と他のトピックに関する Samuel Renkert の回答に基づいて、%EXEC_CMD%
まだ実行されていない場合にのみ実行される次のスクリプトを思いつきました。
@echo off
set EXEC_CMD="rsync.exe"
wmic process where (name=%EXEC_CMD%) get commandline | findstr /i %EXEC_CMD%> NUL
if errorlevel 1 (
%EXEC_CMD% ...
) else (
@echo not starting %EXEC_CMD%: already running.
)
前述のとおり、これには管理者権限が必要です。
ここでは窓を想定しています。したがって、その情報を取得するには WMI を使用する必要があります。The Scripting Guy のアーカイブを調べて、スクリプトから WMI を使用する方法に関する多くの例を確認してください。
親プロセス名を確認する必要があります。.NET ベースのソリューションに関するコード プロジェクトの記事** を参照してください。
非プログラム的なチェック方法:
c:\windows\notepad.exe
)同じことは、親プロセス名を取得することで確認できます。