Показать полную графическую версию : [решено] как в cmd получить список процессов с подстрокой
VictorSh
19-04-2011, 11:42
Здравствуйте,
интересует как в Windows 7 получить в консоли список процессов содержащий подстроку.
Пробовал это:
tasklist /FI "Имя образа eq *api*"
но получается:
Ошибка: Фильтр поиска не опознан.
Однако, если явно указать:
tasklist /FI "Имя образа eq avp.exe", то все прокатыает, но я заранее не знаю ни ID процесса, ни имя образа.
Моя задача: найти через консоль все идентификаторы процессов, содержащие подстроку office и завершить их.
найти через консоль все идентификаторы процессов, содержащие подстроку office и завершить их »
for /f "tokens=2 delims=," %%a in ('tasklist/nh /fo csv^|find/i "office"') do taskkill/pid %%a
P.S. для консоли заменить %%a -> %a
найти через консоль все идентификаторы процессов, содержащие подстроку office и завершить их »вариант через WMI:wmic process where "name like '%%office%%'" call terminate
VictorSh
19-04-2011, 14:43
Спасибо большое! :)
В общих чертах понятно, но есть вопросы по работе команды.
Не совсем понятно с "tokens = 2".
Подстрока в IN выводит список процессов без заголовка в таблицу, а потом с помощью конвейера передаются команде find, которая ищет подстроку без учета регистра. А дальше, чего то не понятно. Читал в for /? что-то не дошло. То есть мы выбираем из результата выполнения find только вторую подстроку, а строка разделена на запятые (delims = ,)?
Потом записываем результат в переменную a и завершаем процесс.
А как быть, если их много (результатов): то есть сдедующий процесс find ищет не с начала таблицы, а в нем что сохраняется типа offset, на котором find остановилась в прошлый раз? то есть он ищет на следующем шаге цикла не с начала таблицы, а с места предыдцщего результата поиска?
Или он убил процесс, а потом заново в новой таблице ищем и поэтому находим не тот же самый процесс, а уже другой?
И еще простой вопрос: а где указано условие завершения цикла, я просто не эксперт в написании скпиртов, писал на с++, там понятно
for (инициализация, проверка условия, что делать на следующем шаге)
{тело цикла},
а тут как то по-другому. Или если find не найдет ничего, то он выдаст false и все закончится?
VictorSh, всё гораздо проще: "FOR /F" построчно перебирает результат команды в скобках: TASKLIST + FIND (который работает как фильтр строк по условию вхождения заданной подстроки), каждую строку делит на токены по символу "," , берет 2-й токен (PID, соответствует %a) и выполняет для каждой строки команду "TASKKILL /PID %a"
VictorSh
19-04-2011, 21:59
спасибо)
"FOR /F" построчно перебирает результат команды в скобках »
То, есть FOR /F заранее знает, сколько будет шагов цикла? а потом натыкается на нуль-символ и заканчивает цикл.
Это похоже это аналог цикла PHP foreach для перебора всех элементов массива.
VictorSh, на самом деле это цикл чтения файла (pipe) вплоть до EOFwhile((c=_fgetchar()) != EOF)
То, есть FOR /F заранее знает, сколько будет шагов цикла? »
Не знает.
а потом натыкается на нуль-символ и заканчивает цикл. »
Читает до конца файла, как уже написал amel27. Если встретит «\0x0» — верно, закончит чтение преждевременно (скорее всего потому, что командный процессор пользует C-шные функции и строки).
…вплоть до EOF
while((c=_fgetchar()) != EOF)
Я бы уточнил (на случай, если кто неправильно поймёт контекст), что именно до реального конца файла, «for /f» не рассматривает символ «\0x1a» в качестве конца файла (т.е., EOF, в примере выше, != \0x1a). И, скорее, что-то наподобие fgets(), нежели _fgetchar().
VictorSh
20-04-2011, 12:09
Теперь кажется все понял :) Спасибо большое, просветили! Тема решена.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.