2012-03-15 2 views
5

Я пытаюсь получить процессы Windows, соответствующие некоторым определенным критериям, например. они похожи на «123456.exe» и пытаются убить их с помощью списка задач. Я пытаюсь сделать это так:Передача идентификаторов PID из списка задач и уничтожения с помощью списка задач

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

, который не является правильным, и я не знаю почему .... Может кто-нибудь дать мне подсказку? Thanx заранее!

ответ

11
FOR /F "usebackq tokens=2" %i IN (`tasklist ^| findstr /r /b "[0-9][0-9]*[.]exe"`) DO taskkill /pid %i 

Несколько изменений:

  • command_to_process нуждается назад кавычки (``) на обеих сторонах команды.
  • Трубы ("|") внутри command_to_process должны быть экранированы с помощью каретки ("^").
  • Ваша команда findstr будет соответствовать всем процессам, у которых есть цифра перед «.exe». Например, «myapp4.exe» также был бы убит. Версия, которую я предоставляю, будет соответствовать именам процессов, содержащим только номера.
  • Параметр «skip = 2» пропускает первые две строки, выводимые из findstr, а не списка задач. Поскольку регулярное выражение не будет соответствовать чему-либо в первых двух строках, выводимых из списка задач, вы можете удалить опцию пропуска.

Кстати, если вы поместите эту команду в пакетном сценарии, не забудьте использовать «%% я» вместо «% я» для параметров, или вы получите сообщение об ошибке, как i was unexpected at this time.

+0

Что бы изменить в команде выше, если я хочу, чтобы убить только первый PID в списке? то есть если у меня есть 2 notepad.exe open, я хочу убить только первый pid в списке. – Jai

+0

Ничего, я понял тайный соус. setlocal enabledelayedexpansion set flag = 0 FOR/F "usebackq tokens = 2" %% i IN ('tasklist^| findstr/r/b" notepad.exe "') DO ( if! flag! == 0 ( ) эхо! флаг! \t Taskkill/PID %% я \t установленный флаг = 1 \t эхо! флаг! ) ) Endlocal – Jai

1

Если разница имя процесса не очень сложный, например, если имя всегда совпадает вы можете использовать/FI вариант Taskkill непосредственно

taskkill /FI "IMAGENAME eq your_image_name_here.exe" 

==>taskkill documentation