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 /NH
cada 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 %%x
se 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.exe
bien, 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 %%x
notará que %%x contiene solo la primera palabra del proceso, en este ejemplo My
de 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 My
y Process.exe
luego las combinas y las comparas con la EXE
var 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