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

1

Estou tentando detectar um processo em execução no Windows 7 usando um arquivo em lotes. Processos sem espaços funcionam bem - por ex. notepad.exe. Não consigo entender por que isso não funciona e realmente aprecio 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 REAL

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

2 respostas

1

Existe 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 pegar uma linha como:

System Idle Process 0 Services 0 24 K (que é o que o %%x manteria) e veja se é igual ao nome do processo fornecido (por exemplo: System Idle Process ).

Devido à informação extra fornecida em cada linha, ela nunca será igual, então você precisa encontrar uma maneira de adquirir uma lista (ou extrair mais) somente dos nomes dos processos.

Além disso:

set "EXE=My Process.exe" não precisa das aspas. Ele sabe que tudo 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 funcionará bem, mesmo com os espaços.

Incluir as 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 tipos (não conhece 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 ficar confuso / quebrar coisas ao tentar usá-lo mais tarde (entre outras citações em outros comandos, etc.).

    
por 12.03.2015 / 18:29
0

Encontrei algum 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
)
    
por 12.03.2015 / 19:39