5

Мне нужно написать пакетную программу, чтобы завершить все задачи коммуникатора MS Office заголовками окон (обычно заканчивающимися шаблоном «- Разговор»).

Я старался

taskkill /FI "WINDOWTITLE eq * Conversation" /IM communicationator.exe

но шаблон подстановки, начинающийся с '*', похоже, не работает. Выдает следующую ошибку

ОШИБКА: фильтр поиска не может быть распознан.

Любые предложения для обходного пути будет принята с благодарностью!

2 ответа2

3

Я действительно ценю ответ Batch-файла, который использует команду FOR.

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

Во-первых, посмотрите, можете ли вы найти процессы MS Communicator с помощью WMIC. например:

СПИСОК ПРОЦЕССОВ WMIC ПОЛНЫЙ

Или для отображения информации в таблице по горизонтали, а не по вертикали в формате Property = Value, выполните:

СПИСОК ПРОЦЕССОВ WMIC ПОЛНЫЙ / ФОРМАТ: ТАБЛИЦА

или, возможно, чтобы ограничить это:

WMIC PROCESS GET NAME /FORMAT:TABLE

(и игнорировать первую строку)

Кажется, что это не показывает заголовок окна, но может показывать много другой информации, которая может быть использована для уникальной идентификации экземпляров Communicator, например, имен исполняемых файлов.

Тогда вы можете стать более агрессивными, сузив свои выводы. Следующее ищет случаи, которые заканчиваются на «name.exe» (например, «filename.exe», «myname.exe»)

ПРОЦЕСС WMIC ГДЕ "Описание типа" %% name.exe "" СПИСОК ПОЛНЫЙ / ФОРМАТ: ТАБЛИЦА

Все это было просто исследование, чтобы настроить вашу команду. (В конце концов, вы не хотите начинать прерывать неправильные процессы.)

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

WMIC ПРОЦЕСС ГДЕ "Описание типа" %% name.exe "" УДАЛИТЬ

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

2

Вот пакетный файл, частично вдохновленный этим вопросом Рожье:

@echo off

for /F "delims=" %%a in ('tasklist /fo list /v') do (
      call :Sub %%a
)
exit /b
 

:Sub
set Line=%*
set BOL4=%Line:~0,4%
set BOL13=%Line:~0,13%
set Value=%Line:~14%
if "%BOL4%"=="PID:" (
      set save_PID=%Value%
      exit /b
)
if "%BOL13%"=="Window Title:" ( // Примечание . ниже.
      echo %Value% | findstr /r /c:"- Conversation.$" > nul
      if not errorlevel 1 (
            echo %save_PID%
            REM taskkill /pid %save_PID%
      )
      exit /b
)
exit /b

Я обнаружил, что мне нужно добавить . в конце регулярного выражения для

echo строка | регулярное выражение | findstr /r заканчивающееся $

Форма для работы.  Я предполагаю, что echo добавляет CR или, возможно, дополнительный CRLF к строке, а findstr считает это как символ, встречающийся между строкой и концом строки.

Очевидно, вы откомментируете команду taskkill вы проверили.

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