Передача PID из списка задач и уничтожение процессов с помощью списка задач

Это относится к моему потоку. Передайте PID из списка задач в taskkill, чтобы завершить процесс, если DLL-файлы остаются открытыми.

Я пытаюсь сделать что-то вроде того, что обсуждалось в этой теме:

FOR /F "usebackq tokens=2 skip=2" %i IN (`tasklist |findstr /r "[0-9].exe") DO taskkill /PID %i

Вышеуказанная команда не запускается. Я хочу получить все процессы, которые похожи 123456.exe и убей их. Что я делаю неправильно?

1 ответ

Вам нужно сделать пару изменений, чтобы это заработало. Этот пример, как вы хотите:

FOR /F "usebackq tokens=1-2" %i IN (`tasklist ^|findstr /b "[0-9]"`) DO taskkill /PID %j

Ваш код:

FOR /F "usebackq tokens=2 skip=2" %i IN (`tasklist |findstr /r "[0-9].exe") DO taskkill /PID %i

Почему ваш код не сработал:

  • Во время выполнения директива skip=2 пропустит ваши первые два результата.
  • Выход Tasklist.exe имеет несколько столбцов. Findstr.exe действует в первом столбце, а Taskkill.exe использует второй. У Taskkill.exe нет и того, и другого.
  • Ваш набор (строка в скобках) должен быть очерчен с помощью обратных кавычек (директива usebackq). В вашем наборе отсутствует последняя обратная цитата.
  • Символ | или 'pipe' зарезервирован. Вы должны избежать этого с символом ^.
  • Набор регулярных выражений, который вы передаете Findstr.exe, дал мне непредвиденные результаты. Я решил это, убрав.exe и дав команду Findstr.exe искать мою строку в начале потока по каналу. Ограниченные таким образом, мои результаты не включали такие программы, как rundll32.exe, который включал ваш набор.

Вы можете найти несколько превосходных примеров сценариев на сайтах Роба Вандервуде и Тимо Салми:

Другие вопросы по тегам