2010-10-15 3 views
19

je les fenêtres suivantes code de lot:Errorlevel dans une boucle (fenêtres batch)

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%) 
) 

Mais cela ne fonctionne pas comme je l'attends.

Tous le nom traite iidbms, IIGCC, iigcd, dmfacp, dmfrcp, rmcmd sont réels, et ils se trouvent, au lieu azerty est un inventèrent un et ne devrait pas le trouver, alors devrait imprimer "aucun processus trouvé 1", mais ce n'est pas, il imprime toujours 0.

Mais ce que j'ai noté est que si je cours le tasklist | findstr /i qwerty à partir de l'invite DOS, juste après il ya que le %errorlevel% = 1.

Quelle sorte de réponse pourrait être ou mieux?

Répondre

21

IF ERRORLEVEL retourne TRUE si le code de retour était égal ou supérieur au errorlevel spécifié. Dans votre exemple, puisque 0 est inférieur à 1, la première instruction errorlevel sera toujours vraie si le code d'erreur réel est 0 ou plus. Ce que vous voulez, c'est tester d'abord errorlevel 1.

.: par exemple

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 
) 

Une autre question est de savoir si vous voulez faire écho à la errorlevel réelle à l'intérieur de la boucle. Étant donné que les variables sont résolues avant le début de la boucle, faisant écho% errorlevel% sera toujours l'écho 0. Si vous voulez faire écho à la valeur au moment de l'exécution, vous devez modifier l'extrait de code comme ceci:

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

J'ai inversé l'ordre (premier 1 puis 0) mais le resul est le même – aemme

+0

Si vous n'avez pas changé le code affiché, alors vous avez besoin d'un goto après votre niveau d'erreur 1 pour sauter l'instruction suivante, ou changer votre condition (utiliser NEQ, etc.). – JRL

+0

un exemple ...? – aemme

0

Vous pouvez utiliser 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 

Utilisation:

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 
Questions connexes