web-dev-qa-db-ja.com

プロセスが存在するかどうかを確認するバッチプログラム

プロセスnotepad.exeが存在するかどうかを確認するバッチプログラムが必要です。

ifnotepad.exeが存在する場合、プロセスを終了します。

elseバッチプログラムは自動的に終了します。

これが私がやったことです:

@echo off
tasklist /fi "imagename eq notepad.exe" > nul
if errorlevel 1 taskkill /f /im "notepad.exe"
exit

しかし、それは機能しません。私のコードの何が問題になっていますか?

26
user2176930

TASKLISTはerrorlevelを設定しません。

echo off
tasklist /fi "imagename eq notepad.exe" |find ":" > nul
if errorlevel 1 taskkill /f /im "notepad.exe"
exit

タスクが見つからない場合にのみ「:」がTASKLIST出力に表示されるため、ジョブを実行する必要があります。したがって、FIND0not foundにエラーレベルを設定しますおよびfoundの場合は1

それにもかかわらず、

taskkill/f/im "notepad.exe"

メモ帳タスクが存在する場合、それを強制終了します-メモ帳タスクが存在しない場合は何もできないため、テストする必要はありません-他に何かしたいことがない限り...

echo off
tasklist /fi "imagename eq notepad.exe" |find ":" > nul
if errorlevel 1 taskkill /f /im "notepad.exe"&exit

あなたが尋ねるとおりに見える-それが存在する場合はメモ帳プロセスを終了し、終了する-それ以外の場合はバッチを続行する

52
Magoo

これは1行のソリューションです。

プロセスが実際に実行されている場合にのみtaskkillを実行します。それ以外の場合は、実行されていないことを通知します。

tasklist | find /i "notepad.exe" && taskkill /im notepad.exe /F || echo process "notepad.exe" not running.

これは、プロセスが実行されていた場合の出力です。

notepad.exe           1960 Console                   0    112,260 K
SUCCESS: The process "notepad.exe" with PID 1960 has been terminated.

これは実行されていない場合の出力です:

process "notepad.exe" not running.
15
nicovota

TASKLISTは、バッチファイルでチェックインできる終了コードを設定しません。終了コードをチェックするための1つの回避策は、標準出力(現在NULにリダイレクトしている)を解析することです。明らかに、プロセスが見つかった場合、TASKLISTはその詳細を表示します。これにはイメージ名も含まれます。したがって、FINDまたはFINDSTRを使用して、TASKLISTの出力にリクエストで指定した名前が含まれているかどうかを確認できます。検索が失敗した場合、FINDFINDSTRの両方がnull以外の終了コードを設定します。だから、これはうまくいくでしょう:

@echo off
tasklist /fi "imagename eq notepad.exe" | find /i "notepad.exe" > nul
if not errorlevel 1 (taskkill /f /im "notepad.exe") else (
  specific commands to perform if the process was not found
)
exit

TASKLISTをまったく含まない代替手段もあります。 TASKLISTとは異なり、TASKKILLは終了コードを設定します。特に、プロセスが存在しなかったためにプロセスを終了できなかった場合は、終了コード128を設定します。指定されたプロセスの場合に実行する必要がある特定のアクションを実行するために、そのコードを確認できます存在しませんでした:

@echo off
taskkill /f /im "notepad.exe" > nul
if errorlevel 128 (
  specific commands to perform if the process
  was not terminated because it was not found
)
exit
9
Andriy M

正しくないものをコーディングするために動作しないのはそのためです。そのため、常に終了し、スクリプト実行者はそれを操作不能なバッチファイルとして読み取り、終了および停止できないようにする必要があります。

tasklist /fi "IMAGENAME eq Notepad.exe" 2>NUL | find /I /N "Notepad.exe">NUL
if "%ERRORLEVEL%"=="0" (
msg * Program is running
goto Exit
)
else if "%ERRORLEVEL%"=="1" (
msg * Program is not running
goto Exit
)

のではなく

@echo off
tasklist /fi "imagename eq notepad.exe" > nul
if errorlevel 1 taskkill /f /im "notepad.exe"
exit
2
Ultra Gamer Ph