Detectar un proceso en ejecución con espacios en el nombre del archivo

Detectar un proceso en ejecución con espacios en el nombre del archivo

Estoy intentando detectar un proceso en ejecución en Windows 7 utilizando un archivo por lotes. Los procesos sin espacios funcionan bien, por ejemplo, notepad.exe. No puedo entender por qué no funciona y realmente agradecería cualquier ayuda.

CÓDIGO

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set "EXE=My Process.exe"

FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto ProcessFound 

goto ProcessNotFound

:ProcessFound
echo 1
goto END

:ProcessNotFound
echo 0
goto END

:END

RESULTADO ESPERADO

C:\test.bat
1

RESULTADO ACTUAL

C:\test.bat
'Process.exe' is not recognized as an internal or external command,
operable program or batch file.
0

Respuesta1

Hay un problema importante con su código y no tiene nada que ver con los espacios en el nombre del proceso.

Cuando ejecuta, tasklist /NHcada línea devuelta es más que solo el nombre del proceso:

C:\temp>tasklist /nh

System Idle Process              0 Services                   0         24 K
System                           4 Services                   0      2,200 K
smss.exe                       400 Services                   0      1,232 K

Entonces estás intentando tomar una línea como:

System Idle Process 0 Services 0 24 K(que es lo que %%xse mantendría) y vea si es igual al nombre del proceso proporcionado (es decir System Idle Process:).

Debido a la información adicional proporcionada en cada línea, nunca será igual, por lo que necesita encontrar una manera de adquirir una lista (o extraer más)sololos nombres de los procesos.

También:

set "EXE=My Process.exe"no necesita las comillas. Sabe que todo lo que está en la línea después del signo igual es el valor a asignar a la variable nombrada en el lado izquierdo. Funcionará set EXE=My Process.exebien, incluso con los espacios.

Incluir comillas alrededor de la parte del valor (como se sugiere en los comentarios) es la forma habitual de delimitar cadenas, pero como Set no se basa en tipos (no distingue una cadena de un número de un triángulo, etc.), incluirá Las citas. Entonces set Filename="My Name"significa que el valor del nombre de archivo es ahora "My Name", incluidas las comillas. Esto puede resultar confuso o romper cosas al intentar usarlo más adelante (entre comillas en otros comandos, etc.).

Respuesta2

Encontré un código diferente que hace el trabajo:

@echo off
tasklist /nh /fi "imagename eq My Process.exe" | find /i "My Process.exe" >nul && (
echo 1
) || (
echo 0
)

Respuesta3

Me topé con esto y las respuestas no ayudaron en mi caso, así que encontré una solución para cualquiera que se topara con un caso similar.

Como mencionaron otras respuestas antes que yo, set "EXE=My Process.exe"funciona bien sin las comillas.

El mayor problema viene con el bucle for. Si lo ejecuta como lo hizo, FOR /F %%xnotará que %%x contiene solo la primera palabra del proceso, en este ejemplo Myde My Process.exe.

Para solucionarlo, puede utilizar los indicadores token y delimitadores en el comando de bucle FOR /F. Al agregar las primeras 2 cadenas como tokens, obtienes 2 variables Myy Process.exeluego las combinas y las comparas con la EXEvar original.

Debería verse algo como esto:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
set EXE=My Process.exe

FOR /F "tokens=1,2 delims= " %%G IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF "%%G %%H" == "%EXE%" goto ProcessFound 

goto ProcessNotFound

:ProcessFound
echo 1
goto END

:ProcessNotFound
echo 0
goto END

:END

información relacionada