293

アプリケーションがバッチ (cmd) ファイルから実行されているかどうかを確認するにはどうすればよいですか?

プログラムが既に実行されている場合、別のインスタンスを起動する必要はありません。(アプリを変更して単一インスタンスのみにすることはできません。)

また、アプリケーションは任意のユーザーとして実行できます。

4

19 に答える 19

62

これが私がそれを解決した方法です:

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

上記は、まだ実行されていない場合、メモ帳を開きます。

編集:タスクリストから非表示になっているアプリケーションは検索されないことに注意してください。これらは自動的に非表示になるため、これには、別のユーザーとして実行されているスケジュールされたタスクが含まれます。

于 2008-10-02T13:49:32.260 に答える
20

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)

于 2011-01-24T14:23:19.847 に答える
8

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
于 2008-12-02T18:29:57.037 に答える
6

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

これが他の誰かに役立つことを願っています。

于 2011-08-10T08:04:34.163 に答える
2

組み込みの CMD でこれを行う方法はわかりませんが、 grepがある場合は、次のことを試すことができます。

tasklist /FI "IMAGENAME eq myApp.exe" | grep myApp.exe
if ERRORLEVEL 1 echo "myApp is not running"
于 2008-10-02T13:50:16.360 に答える
0

Matt (2008-10-02)から提供されたスクリプトを使用しました。私が問題を抱えた唯一のことは、search.logファイルが削除されないことでした。cdプログラムを開始するために別の場所に行かなければならなかったので、私は期待しています。cdBATファイルと現在の場所に戻りますが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
于 2010-06-23T15:57:31.430 に答える
0

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.
)

前述のとおり、これには管理者権限が必要です。

于 2013-09-18T13:44:48.323 に答える
0

ここでは窓を想定しています。したがって、その情報を取得するには WMI を使用する必要があります。The Scripting Guy のアーカイブを調べて、スクリプトから WMI を使用する方法に関する多くの例を確認してください。

于 2008-10-02T13:37:29.917 に答える
-2

親プロセス名を確認する必要があります。.NET ベースのソリューションに関するコード プロジェクトの記事** を参照してください。

非プログラム的なチェック方法:

  1. Cmd.exe を起動します。
  2. アプリケーションを起動します (例: c:\windows\notepad.exe)
  3. Process Explorerで Notepad.exe プロセスのプロパティを確認する
  4. 親プロセスを確認します (これは cmd.exe を示しています)

同じことは、親プロセス名を取得することで確認できます。

于 2008-10-02T13:36:45.457 に答える