2010-10-15 76 views
19

,我有以下窗口批處理代碼:ERRORLEVEL在for循環(批量窗口)

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是發明之一,不應該找到它,所以應該打印「沒有過程發現1」,但它不,它總是打印0.

但我所指出的是,如果我運行tasklist | findstr /i qwerty來自dos提示符,就在%errorlevel% = 1之後。

什麼樣的答案可以是或更好的是?

回答

21

IF ERRORLEVEL返回TRUE返回代碼比規定錯誤級別以上。在你的例子中,由於0低於1,如果實際的錯誤代碼是0或更高,第一個錯誤級別語句將始終爲真。你想要的是首先測試errorlevel 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 
) 

的另一個問題是,如果你想從內部回聲實際的錯誤級別的循環。由於變量循環開始前得到解決,呼應%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! 
) 
+0

我有相反的順序(第1再0),但resul是一樣的 – aemme 2010-10-15 13:18:34

+0

如果你沒有改變發佈的代碼,那麼你需要在錯誤級別1之後跳轉到下一條語句,或者改變你的條件(使用NEQ等)。 – JRL 2010-10-15 13:21:13

+0

一些例子...? – aemme 2010-10-15 13:34:44

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