Detecte um processo em execução com espaços no nome do arquivo

Detecte um processo em execução com espaços no nome do arquivo

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 /NHcada 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 %%xseria 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.exevai 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 Myfrom 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 EXEvar 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

informação relacionada