0

シナリオ1:calc.exeが実行されている

taskkill /IM calc.exe /f | if "%ERRORLEVEL%"=="0" taskkill /IM calc.exe /f  

これにより、エラーレベルとして1が設定されます。

シナリオ2:calc.exeが実行されていません

taskkill /IM calc.exe /f  

これにより、エラーレベルとして128が設定されます。

誰かがこれが発生する理由と、最初のシナリオでも2番目のシナリオと同様にエラーレベルを128にする方法があるかどうかを説明してもらえますか?

4

1 に答える 1

0

taskkilltasklistおよびで実験しましfindた。すべて一貫性のないエラーレベルを返します。これにより、エラーレベルを確実に使用して、プロセスが実行されているかどうか、またはプロセスが本当に終了したかどうかを知ることができなくなります。ただし、エラーレベルを使用せずにそれを行う方法を見つけました。

@echo off

setlocal ENABLEDELAYEDEXPANSION

set _i=0
for /f "delims=" %%i in ('tasklist ^| find /i "%1"') do set /a _i+=1

if !_i! GTR 0 (

  echo Found !_i! instances of %1.  Terminating all instances...
  taskkill /im "%1" /f > nul 2>&1

  echo Verifying that %1 has been terminated...
  set _i=0
  for /f "delims=" %%i in ('tasklist ^| find /i "%1"') do set /a _i+=1

  if !_i! EQU 0 (
    echo %1 was successfully terminated.
  ) else (
    echo %1 was *not* teriminated.  There are still !_i! instances running.
  )

) else (
  echo %1 is not running.
)

set _i=
endlocal

_i変数を適切に評価できるように、遅延展開を有効にする必要があります。

for ... %%iコード行は、プロセスがメモリ内にあるインスタンスの数に等しく設定さ_iれます。findは一貫したエラーレベルを返さないため、この手法を使用して、メモリ内にある回数を確実に見つけることができます...

于 2013-01-15T21:09:53.740 に答える