Estou tentando detectar um processo em execução no Windows 7 usando um arquivo em lote. Processos sem espaços funcionam perfeitamente - por exemplo, notepad.exe. Não consigo entender por que não funciona e realmente apreciaria qualquer ajuda.
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 ATUAL
C:\test.bat
'Process.exe' is not recognized as an internal or external command,
operable program or batch file.
0
Responder1
Há um grande problema com o seu código e não tem nada a ver com espaços no nome do processo.
Quando você executa, tasklist /NH
cada linha retornada é mais do que apenas o nome do processo:
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
Então você está tentando seguir uma linha como:
System Idle Process 0 Services 0 24 K
(que é o que %%x
seria válido) e veja se é igual ao nome do processo fornecido (ou seja System Idle Process
:).
Devido às informações extras fornecidas em cada linha, elas nunca serão iguais, então você precisa encontrar uma maneira de adquirir uma lista (ou extrair mais)apenasos nomes dos processos.
Também:
set "EXE=My Process.exe"
não precisa das aspas. Ele sabe que tudo que está na linha após o sinal de igual é o valor a ser atribuído à variável nomeada no lado esquerdo. Então set EXE=My Process.exe
vai funcionar bem, mesmo com os espaços.
Incluir aspas ao redor da parte do valor (como sugerido nos comentários) é a maneira usual de delimitar strings, mas como Set não é baseado em tipo (ele não reconhece uma string de um número de um triângulo, etc.), incluirá as citações. Então set Filename="My Name"
significa que o valor do nome do arquivo é agora "My Name"
, incluindo as aspas. Isso pode confundir/quebrar as coisas ao tentar usá-lo posteriormente (entre outras aspas em outros comandos, etc.).
Responder2
Encontrei um código diferente que faz o trabalho:
@echo off
tasklist /nh /fi "imagename eq My Process.exe" | find /i "My Process.exe" >nul && (
echo 1
) || (
echo 0
)
Responder3
Me deparei com isso e as respostas não ajudaram no meu caso, então encontrei uma solução alternativa para qualquer pessoa que se deparasse com um caso semelhante.
como outras respostas mencionadas antes de mim set "EXE=My Process.exe"
funcionam bem sem as aspas.
o maior problema vem com o loop for, se você executá-lo como fez FOR /F %%x
, notará que %%x contém apenas a primeira palavra do processo, neste exemplo My
from My Process.exe
.
Para corrigir isso, você pode usar os sinalizadores token e delims no comando de loop FOR /F. Ao adicionar as 2 primeiras strings como tokens, você obtém 2 variáveis My
e Process.exe
, depois as combina e compara com a EXE
var original.
Deve ser algo assim:
@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