Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] как в cmd получить список процессов с подстрокой (http://forum.oszone.net/showthread.php?t=205148)

VictorSh 19-04-2011 11:42 1661604

как в cmd получить список процессов с подстрокой
 
Здравствуйте,

интересует как в Windows 7 получить в консоли список процессов содержащий подстроку.

Пробовал это:
Код:

tasklist /FI "Имя образа eq *api*"
но получается:
Код:

Ошибка: Фильтр поиска не опознан.
Однако, если явно указать:
tasklist /FI "Имя образа eq avp.exe", то все прокатыает, но я заранее не знаю ни ID процесса, ни имя образа.

Моя задача: найти через консоль все идентификаторы процессов, содержащие подстроку office и завершить их.

amel27 19-04-2011 11:57 1661612

Цитата:

Цитата VictorSh
найти через консоль все идентификаторы процессов, содержащие подстроку office и завершить их »

Код:

for /f "tokens=2 delims=," %%a in ('tasklist/nh /fo csv^|find/i "office"') do taskkill/pid %%a
P.S. для консоли заменить %%a -> %a

amel27 19-04-2011 13:07 1661676

Цитата:

Цитата VictorSh
найти через консоль все идентификаторы процессов, содержащие подстроку office и завершить их »

вариант через WMI:
Код:

wmic process where "name like '%%office%%'" call terminate

VictorSh 19-04-2011 14:43 1661732

Спасибо большое! :)

В общих чертах понятно, но есть вопросы по работе команды.

Не совсем понятно с "tokens = 2".
Подстрока в IN выводит список процессов без заголовка в таблицу, а потом с помощью конвейера передаются команде find, которая ищет подстроку без учета регистра. А дальше, чего то не понятно. Читал в for /? что-то не дошло. То есть мы выбираем из результата выполнения find только вторую подстроку, а строка разделена на запятые (delims = ,)?
Потом записываем результат в переменную a и завершаем процесс.

А как быть, если их много (результатов): то есть сдедующий процесс find ищет не с начала таблицы, а в нем что сохраняется типа offset, на котором find остановилась в прошлый раз? то есть он ищет на следующем шаге цикла не с начала таблицы, а с места предыдцщего результата поиска?
Или он убил процесс, а потом заново в новой таблице ищем и поэтому находим не тот же самый процесс, а уже другой?

И еще простой вопрос: а где указано условие завершения цикла, я просто не эксперт в написании скпиртов, писал на с++, там понятно
for (инициализация, проверка условия, что делать на следующем шаге)
{тело цикла},
а тут как то по-другому. Или если find не найдет ничего, то он выдаст false и все закончится?

amel27 19-04-2011 15:55 1661772

VictorSh, всё гораздо проще: "FOR /F" построчно перебирает результат команды в скобках: TASKLIST + FIND (который работает как фильтр строк по условию вхождения заданной подстроки), каждую строку делит на токены по символу "," , берет 2-й токен (PID, соответствует %a) и выполняет для каждой строки команду "TASKKILL /PID %a"

VictorSh 19-04-2011 21:59 1661961

спасибо)

Цитата:

Цитата amel27
"FOR /F" построчно перебирает результат команды в скобках »

То, есть FOR /F заранее знает, сколько будет шагов цикла? а потом натыкается на нуль-символ и заканчивает цикл.
Это похоже это аналог цикла PHP foreach для перебора всех элементов массива.

amel27 20-04-2011 03:13 1662074

VictorSh, на самом деле это цикл чтения файла (pipe) вплоть до EOF
Код:

while((c=_fgetchar()) != EOF)

Iska 20-04-2011 04:57 1662089

Цитата:

Цитата VictorSh
То, есть FOR /F заранее знает, сколько будет шагов цикла? »

Не знает.
Цитата:

Цитата VictorSh
а потом натыкается на нуль-символ и заканчивает цикл. »

Читает до конца файла, как уже написал amel27. Если встретит «\0x0» — верно, закончит чтение преждевременно (скорее всего потому, что командный процессор пользует C-шные функции и строки).
Цитата:

Цитата amel27
…вплоть до EOF
Код:

while((c=_fgetchar()) != EOF)

Я бы уточнил (на случай, если кто неправильно поймёт контекст), что именно до реального конца файла, «for /f» не рассматривает символ «\0x1a» в качестве конца файла (т.е., EOF, в примере выше, != \0x1a). И, скорее, что-то наподобие fgets(), нежели _fgetchar().

VictorSh 20-04-2011 12:09 1662268

Теперь кажется все понял :) Спасибо большое, просветили! Тема решена.


Время: 16:58.

Время: 16:58.
© OSzone.net 2001-