web-dev-qa-db-ja.com

バッチIF.exeが実行されていない

Program.exeが処理中で実行されていないバッチを作成しようとしています。以下のコードが実行されます。 vb.netではこれは簡単ですが、プログラムを作成したくありません。 VBSスクリプトが機能すると思いますが、上記を実行するバッチルーチンを作成できるかどうかを確認しようとしています。

。コウモリ:

@ECHO OFF

REM peudo code:

If NOT program.exe Exist

'Do something.

上記は機能しないので、何が欠けていますか?

2
Benjamin Jones

ここに行く:

@echo off
tasklist /FI "IMAGENAME eq program.exe" 2>NUL | find /I /N "program.exe" >NUL
if "%ERRORLEVEL%"=="0" echo Program is running.

Tasklist.exeを使用してプログラム名に一致するタスクのリストを取得し、findを使用してプログラムが実際にリストに存在するかどうかを判断します。

次に、findによって返されたエラーコードを使用して、見つかったかどうかを判断し、見つかった場合はコード(この場合はエコー)を実行します。

TasklistとFindからの出力はNULLに送信されます。

ソース

5

これが私の提案です:

@echo off
tasklist /FI "IMAGENAME eq program.exe" | findstr "program.exe" >nul
if %ERRORLEVEL% == 1 goto mycode
goto eof
:mycode

rem put your code here

:eof
exit

@ techie007が提案したように、完全一致のみを出力するため、tasklist /FI "IMAGENAME eq program.exe"をお勧めします。したがって、cmd.exeを検索しているときは、htcmd.exeをヒットしていません。 。

なぜ彼がfind /I /Nを提案しているのかわかりませんが、個人的にはfindstrの方がはるかに用途が広いので好きですが、彼の提案ではそれで仕事が終わります。

最後の部分は、私の提案が@ techie007のif %ERRORLEVEL% == 1 goto mycodegoto eofと異なるところです。これは、if elseステートメントとして機能するため、プログラムが実行されていない場合は、mycodeに移動します(ここに入力します)よく...あなたのコード)それ以外の場合はeofに移動し、バッチを終了します。

@ techie007の唯一の欠点は、if "%ERRORLEVEL%"=="0" echo Program is running.です。これが真であるか偽であるかに関係なく、次のコード行が実行されます。これが、複数行のコードをサポートするため、goto方法論の使用を推奨したかった理由です。

1
50-3

Windows7での次の作業。

tasklist | findstr /i "appName.exe" > nul && echo Yeah || echo Nope

同じ行の&&の後のコマンドは、findstr"appName.exe"を見つけたときに実行され、同じ行の||の後のコマンドをスキップします。それ以外の場合、findstr"appName.exe"を見つけられなかった場合、&&の後のコマンドをスキップし、||の後のコマンドを実行します。

成功および/または失敗のために複数のコマンドが必要な場合:

tasklist | findstr /i "appName.exe" > nul && ( 
    echo.Yeah
    echo.It's running.
) || (
    echo.Nope
    echo.Don't hope.
)
0
acegs
echo off
SETLOCAL EnableExtensions
set EXE=YourProgram.exe
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
echo Not running
pause
goto FIN
:FOUND
echo Running
pause
:FIN

これは私のために働いた。

0
Mdsoebee