tag online mp3tag mp3meta mp3id windows batch-file errorlevel

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

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

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