파일 이름에 공백이 있는 실행 중인 프로세스 감지

파일 이름에 공백이 있는 실행 중인 프로세스 감지

배치 파일을 사용하여 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.

이 문제를 해결하려면 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

관련 정보