Обнаружить запущенный процесс с пробелами в имени файла

Обнаружить запущенный процесс с пробелами в имени файла

Я пытаюсь обнаружить запущенный процесс в Windows 7 с помощью пакетного файла. Процессы без пробелов работают нормально - например, notepad.exe. Я не могу понять, почему это не работает, и был бы очень признателен за любую помощь.

КОД

@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

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

C:\test.bat
1

ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ

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

решение1

В вашем коде есть одна серьезная проблема, и она не связана с пробелами в имени процесса.

При запуске tasklist /NHкаждая строка возвращает больше, чем просто имя процесса:

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

Итак, вы пытаетесь взять такую ​​строку:

System Idle Process 0 Services 0 24 K(что и %%xбудет выполнено) и проверьте, совпадает ли оно с указанным именем процесса (например: System Idle Process).

Из-за дополнительной информации, представленной в каждой строке, она никогда не будет одинаковой, поэтому вам нужно найти способ получить список (или извлечь его дополнительно)тольконазвания процессов.

Также:

set "EXE=My Process.exe"не нужны кавычки. Он знает, что все в строке после знака равенства — это значение, которое нужно присвоить переменной, указанной слева. Так что set EXE=My Process.exeбудет работать нормально, даже с пробелами.

Включение кавычек вокруг части значения (как предлагается в комментариях) является обычным способом разграничения строк, но поскольку Set не основан на типе (он не отличает строку от числа от треугольника и т. д.), он включит кавычки. Это set Filename="My Name"означает, что значение Filename теперь "My Name", включая кавычки. Это может сбивать с толку/сломать все при попытке использовать его позже (между другими кавычками в других командах и т. д.).

решение2

Я нашел другой код, который выполняет эту работу:

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

решение3

Я наткнулся на это, и ответы не помогли мне в моем случае, поэтому я нашел обходной путь для тех, кто столкнулся с похожей ситуацией.

как и другие ответы, упомянутые мной ранее, set "EXE=My Process.exe"прекрасно работают без кавычек.

большая проблема возникает с циклом for, если вы запустите его так, как вы это сделали FOR /F %%x, то заметите, что %%x содержит только первое слово процесса, в этом примере Myиз My Process.exe.

Чтобы исправить это, вы можете использовать флаги token и delims в команде цикла FOR /F. Добавляя первые 2 строки как токены, вы получаете 2 переменные Myи Process.exe, затем вы объединяете их и сравниваете с исходной EXEvar.

Должно выглядеть примерно так:

@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

Связанный контент