Фильтр в tasklist.exe не принимает подстановочные знаки?

ОС: Windows XP, Windows 7 64bit.

У нас есть довольно тяжелые сценарии cmd, которые используются для некоторых ежедневных процессов сборки. Эти скрипты порождают множество других (оконных) процессов. Существует один управляющий cmd script, небольшой простой script, который запускает основной cmd script. Целью небольшого контроля script является очистка в ситуациях, когда основной script или любой из его детей терпят неудачу. Это выполняется довольно легко: основной script и все его дочерние элементы имеют названия окон, которые начинаются с уникального идентификатора. Когда контрольный script определяет, что основной script и все его дочерние элементы должны были быть завершены, он использует список задач для поиска окон любых зависающих процессов, используя:

tasklist.exe/FI "WINDOWTITLE eq UniqueIdentifier *"

Все это очень хорошо работало в XP. Теперь введите 64-разрядную версию Windows7. Здесь, если основной .cmd script или любое другое окно оболочки .cmd пытается установить заголовок окна через

title UniqueIdentifier Followed By Descriptive Text

Windows7 64-bit доброжелательно добавляет другой текст в заголовок (в частности, "Администратор:" или аналогичный). На добавочный текст нельзя полагаться. Итак, теперь мы хотим использовать

tasklist.exe /FI "WINDOWTITLE eq *UniqueIdentifier*"

но ЭТО НЕИСПРАВНОСТИ с сообщением об ошибке "Фильтр поиска не может быть распознан". Прохождение маршрута использования нашего UniqueIdentifier в качестве пост-исправления не работает: команда

tasklist.exe /FI "WINDOWTITLE eq *UniqueIdentifier"

также приводит к тому же сообщению об ошибке. Похоже, что понятие "подстановочные знаки" Microsoft в фильтре не распространяется за пределы "*" в качестве символа терминала. Уч.

ЛЮБОЕ ИМЕЕТ ЛЮБЫЕ РАБОТЫ? Pslist не позволяет фильтровать с заголовком окна.

Ответ 1

Вы можете использовать параметр /V, чтобы включить заголовок окна в вывод, а затем передать результат FIND (или FINDSTR) для фильтрации результата.

tasklist /v | find "UniqueIdentifier"
tasklist /v | findstr /c:"UniqueIdentifier"

Если вы используете FINDSTR, я рекомендую использовать параметр /C, чтобы вы могли включать пробелы в строку поиска.

Возможно, вы захотите использовать параметр /I, если вам нужно выполнить поиск без учета регистра.

Ответ 2

Я думаю, что это работает в Windows 10. Вот мой фрагмент

set PROCNAME="Foobar"
tasklist /FI "IMAGENAME eq %PROCNAME%*" 2>NUL | find /I /N %PROCNAME%>NUL
if "%ERRORLEVEL%"=="0" (
    echo it is running
)

Обратите внимание на звездочку в фильтре.

Ответ 3

Исходя из моих экспериментов, подстановочный знак для taskkill, кажется, работает только в конце строки, а не в любой другой позиции. Я не могу найти документацию от Microsoft, так или иначе об этом. Однако все примеры в документации следуют этому формату

Successful:  notepad*
Fails: notepad*.exe
Fails *notepad*

Как уже упоминалось в другом ответе, лучше всего проанализировать вывод списка задач, чтобы получить именно то, что вы хотите, а не полагаться на довольно нарушенное поведение taskkill.