1

Я пытаюсь обнаружить запущенный процесс в 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

2 ответа2

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" означает, что значением имени файла теперь является "My Name" , включая кавычки. Это может сбить с толку / сломать вещи при попытке использовать его позже (между другими кавычками в других командах и т.д.).

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .