25

私は次のWindowsバッチコードを持っています:

for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
  tasklist | findstr /i %%i
  echo %errorlevel%
  if %errorlevel% == 0 (echo %%i ok process found %errorlevel%)
  if %errorlevel% == 1 (echo %%i no process found %errorlevel%)
)

しかし、それは私が期待するようには機能しません。

すべての名前プロセスiidbmsiigcciigcddmfacpdmfrcprmcmdは本物であり、検出されます。代わりに、 qwertyは発明されたものであり、検出されないはずなので、「no process found 1」と出力する必要がありますが、検出されません。 、常に0を出力します。

しかし、私が気付いたのはtasklist | findstr /i qwerty、dosプロンプトからを実行すると、その直後に%errorlevel%=1であるということです。

どのような答えがありますか、それ以上ですか?

4

3 に答える 3

35

追加

setlocal EnableDelayedExpansion

スクリプトの先頭に移動し、 !errorlevel!代わりにを使用します%errorlevel%

遅延拡張により、変数は解析時ではなく実行時に拡張されます

〜http ://ss64.com/nt/delayedexpansion.html

私を正しい方向に向けた別の質問への答え:https ://stackoverflow.com/a/6658935/10245

于 2012-07-27T16:35:07.943 に答える
31

IF ERRORLEVELは、戻りコードが指定されたエラーレベル以上の場合にTRUEを返します。この例では、0は1より小さいため、実際のエラーコードが0以上の場合、最初のエラーレベルステートメントは常にtrueになります。必要なのは、最初にエラーレベル1をテストすることです。

例えば:

for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
    tasklist | findstr /i %%i
    if errorlevel 0 if not errorlevel 1 echo process
    if errorlevel 1 if not errorlevel 2 echo process not found
)

もう1つの問題は、forループ内から実際のエラーレベルをエコーする場合です。変数はループの開始前に解決されるため、%errorlevel%をエコーすると、常に0がエコーされます。実行時に値をエコーする場合は、次のようにスニペットを変更する必要があります。

setlocal enabledelayedexpansion
for %%i in (iidbms iigcc iigcd dmfacp dmfrcp rmcmd qwerty) do (
    tasklist | findstr /i %%i
    if errorlevel 0 if not errorlevel 1 echo %%i ok process found !errorlevel!
    if errorlevel 1 if not errorlevel 2 echo %%i no process found !errorlevel!
)
于 2010-10-15T13:04:37.090 に答える
0

あなたはvbscriptを使うことができます、

NumArgs = WScript.Arguments.Count
strComputer="."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process")
For Each objProcess in colProcessList
    For i=0 To NumArgs-1
        If InStr( objProcess.Name ,WScript.Arguments(i)  ) > 0 Then
            WScript.Echo "found:" & WScript.Arguments(i)
        End If 
    Next 
Next

使用法:

C:\test>cscript //nologo test.vbs explorer spool svchost
found:svchost
found:svchost
found:svchost
found:svchost
found:svchost
found:explorer
found:svchost
found:spool
于 2010-10-15T13:03:25.697 に答える