windows - online - Nivel de error en un bucle For(ventanas por lotes)
tag rename (3)
Añadir
setlocal EnableDelayedExpansion
al inicio de su script, luego use !errorlevel!
en lugar de %errorlevel%
La expansión demorada hará que las variables se expandan en el tiempo de ejecución en lugar de en el tiempo de análisis
La respuesta a otra pregunta que me indicó la dirección correcta: https://stackoverflow.com/a/6658935/10245
Tengo el siguiente código de lote de 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%)
)
Pero no funciona como espero.
Todos los procesos de nombre iidbms , iigcc , iigcd , dmfacp , dmfrcp , rmcmd son reales y se encuentran, en cambio qwerty es un inventado y no debería encontrarlo, por lo que debe imprimir "no se encontró un proceso 1" , pero no es así. , siempre imprime 0.
Pero lo que he notado es que si ejecuto la tasklist | findstr /i qwerty
tasklist | findstr /i qwerty
desde el indicador de DOS, justo después de que %errorlevel%
= 1.
¿Qué tipo de respuesta podría ser o mejor?
IF ERRORLEVEL devuelve VERDADERO si el código de retorno fue igual o superior al nivel de error especificado. En su ejemplo, como 0 es menor que 1, la primera declaración de nivel de error siempre será verdadera si el código de error real es 0 o superior. Lo que quieres es probar primero para errorlevel 1.
P.ej:
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
)
Otro problema es si desea repetir el nivel de error real dentro del bucle for. Dado que las variables se resuelven antes del inicio del bucle, el eco de% errorlevel% siempre se repetirá 0. Si desea repetir el valor en el tiempo de ejecución, debe modificar el fragmento de código de la siguiente manera:
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!
)
Puedes usar 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
Uso:
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