Имена процессов длиной более 21 символа не обнаружены / не поддерживаются в TaskList - PullRequest
1 голос
/ 12 июня 2019

Я хочу, чтобы мой пакетный файл проверил, что имя процесса существует и работает с использованием TaskList, прежде чем продолжить работу с кодом, но, к сожалению, он не будет работать, если имя процесса содержит более 21 символа. Есть ли способ убрать ограничение на количество символов или поддержать имена процессов длиной более 21 символа?

Я пытался использовать любое другое имя процесса с 21 символом или меньше, и код работает без нареканий. Я не пробовал ничего другого, так как искал в Интернете, но не смог найти ничего, соответствующего моей проблеме, или понятия не имею, почему он не обнаружит слишком длинные имена процессов. Я сократил свой код, чтобы он был короче и легче для понимания.

@echo off

set ProcessName=PROCESSNAME

for /f "tokens=4-7 delims=[.] " %%i in ('ver') do (if %%i==Version (set v=%%j.%%k) else (set version=%%i.%%j))

if "%version%" == "10.0" goto win10 

:win10
setlocal
echo Press any key to start...
pause >nul

tasklist /fi "IMAGENAME eq %ProcessName%.exe" 2>NUL | find /I /N "%ProcessName%.exe">NUL
if "%ERRORLEVEL%"=="1" (
goto error
)

echo Process detected.
pause
exit

:error
echo WARNING! This process is not running. Make sure it is running or written properly.
pause

Чтобы проверить это, вы можете создать поддельный .exe и дать ему длинное имя, а затем заменить это имя в этой строке:

set ProcessName=PROCESSNAME

Я ожидаю, что будет поддерживаться любое имя процесса с 22 символами и более.

Ответы [ 3 ]

2 голосов
/ 13 июня 2019

Вы можете изменить формат вывода tasklist с помощью переключателя /fo:

/FO    format           Specifies the output format.
                       Valid values: "TABLE", "LIST", "CSV".

Изменение формата на CSV позволяет использовать более крупные имена процессов.

Попробуйте это:

tasklist /fo csv /fi "IMAGENAME eq %ProcessName%.exe" 2>NUL | find /I /N "%ProcessName%.exe">NUL
0 голосов
/ 13 июня 2019

BDM 's ответ показывает, как этого добиться tasklist возвращает также более длинные имена процессов.

Просто позвольте мне указать, что опция фильтра /FI (tasklist /FI "ImageName eq process.exe") принимает более длинные имена процессов (или изображений), только усеченный текст может быть усечен.

В любом случае, вы не выводите имена процессов на консоль, но отправляете их в find, поэтому возвращаемый текст действительно уместен.

Но вместо того, чтобы снова искать в возвращенном списке процессов имена процессов, просто чтобы определить, запущен ли хотя бы один из них, вы можете отменить поиск, чтобы захватитьtasklist сообщение, когда findstr не встречает соответствующих процессов, например:

tasklist /FI "ImageName eq %ProcessName%.exe" | findstr /V /B /C:"INFO: " > nul

Это, как и ваша команда find, устанавливает ErrorLevel в случае, если не найдено ни одного соответствующего процесса.


Альтернативой tasklist является команда wmic:

wmic Process where "Name='%ProcessName%.exe'" get Name,ProcessID

И вместе с find:

wmic Process where "Name='%ProcessName%.exe'" get Name,ProcessID 2> nul | find /I ".exe" > nul
0 голосов
/ 13 июня 2019

Один из способов - получить процессы с помощью PowerShell.

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET $ProcessName = 'svnserve'
SET "RUNNING=false"

FOR /F "delims=" %%p IN ('powershell -NoLogo -NoProfile -Command ^
    "(Get-Process -ProcessName $ProcessName -ErrorAction SilentlyContinue).ProcessName"') DO (
    SET "RUNNING=true"
)

ECHO RUNNING is %RUNNING%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...