Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58

Process.Kill() по маске

05.11.2013, 11:50. Показов 3449. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, коллеги!

Подскажите пожалуйста, как элегантно (и кратко) решить следующую задачу:
-получить список всех выполняющихся процессов;
-выбрать те из них, имена которых совпадают с фильтром;
-прибить выбранные
Проще всего (но не элегантнее с моей тз) -
C#
1
2
3
4
foreach (Process ps in Process.GetProcesses())
{
   if (ps.ProcessName == "ps1" || ps.ProcessName == "ps2" || ps.ProcessName == "ps3") ps.Kill()
}
Улулчшил с помощью List<Process>.FindAll(), но осталось кривое сравнение имени процесса с несколькими ИЛИ. В питоне удобно - for processname in (processname1, processname2, processname3) - перечисление предварительно инициализировать не надо. Как реализовать на шарпе? Есть ли более элегантный способ решения? (LINQ? лямбда с фильтрацией?)
Спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.11.2013, 11:50
Ответы с готовыми решениями:

Замена фразы по маске на другую фразу по маске в файле
Добрый день! Имеется задача, которую, к сожалению, пока не могу реализовать: Есть текстовый файл состоящий из множества строк. В нем...

Kill Process
Подскажите функцию убить процесс и поиск запущенного процесса плиз. также нее пойму как работает функция Process List. Пурик 5.60 х86

Process kill
Всем привет. Рассказываю как стоит задача. Есть 2 процесса, если они появляются их надо убить. Т.е программа должна работать столько...

14
145 / 45 / 16
Регистрация: 10.10.2013
Сообщений: 110
05.11.2013, 11:57
такой вариант
C#
1
2
3
4
5
6
7
8
 string[] pr_names = { "ps1", "ps2", "ps2" };
            foreach (Process ps in Process.GetProcesses())
            {
                if (pr_names.Contains(ps.ProcessName))
                {
                    ps.Kill();
                }
            }
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
05.11.2013, 11:58
Можно так
C#
1
2
string[] names = {"name1", "name2", "name3", "etc"};
if(names.Contains(process.ProcessName)) process.Kill();
0
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
05.11.2013, 12:09  [ТС]
Спасибо за ответы, как раз таки хотелось обойтись без создания именованного перечисления. Т.е. вместо
string[] names = {...} динамически создать массив/лист прямо в цикле:
foreach (string processname in ("ps1","ps2" и т.д.)
Смысл создавать именованный массив, если используешь его только единожды, более того, если я верно понимаю, если можно обойтись без операции присвоения (имею в виду string[] names = ...), то тогда можно использовать метод ForEach() List<Process> и записать все выражение одной строкой
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.11.2013, 12:17
Цитата Сообщение от Mif Посмотреть сообщение
динамически создать массив/лист прямо в цикле:
C#
1
foreach (string processname in new string[]{"ps1", "ps2"})
0
145 / 45 / 16
Регистрация: 10.10.2013
Сообщений: 110
05.11.2013, 12:19
ViterAlex,
Цитата Сообщение от ViterAlex Посмотреть сообщение
C#
1
foreach (string processname in new string[]{"ps1", "ps2"})
и теперь остается все процессы пихать в именованную коллекцию ,а автор этого не любит )
0
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
05.11.2013, 12:23  [ТС]
Ага, спасибо! А как ввернуть в метод FindAll(), не подскажете?
C#
1
2
3
4
5
6
7
8
new List<Process>(
                Process.GetProcesses()).FindAll(
                (Process ps) => { 
                    
                   [B] if (ps.ProcessName == "ps1" || ps.ProcessName == "ps2" || ...)
                        return true; 
                    return false; }[/B]
                    ).ForEach((Process ps) => ps.Kill());
т.е. заменить то, что болдом? Findall же делегат требует, верно?
0
145 / 45 / 16
Регистрация: 10.10.2013
Сообщений: 110
05.11.2013, 12:26
вообще если вы хотите фильтровать по маске ,то тут будет уместен Regex
C#
1
2
3
4
5
6
7
8
Regex reg= new Regex(@"\D+\d+");
            foreach (Process ps in Process.GetProcesses())
            {
                if (reg.IsMatch(ps.ProcessName))
                {
                    ps.Kill();
                }
            }
0
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
05.11.2013, 12:30  [ТС]
с регулярками у меня есть отдельная задача, которую реализовал, но хотел бы улучшить синтаксическим сахаром. Но она требует создания отдельной темы.
А тут не совсем понятно, какое регулярное выражение использовать - имена фильтруемых процессов разные, длина имени тоже разная, буквы не совпадают. Ну и опять-таки, создаем именованный объект =)
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.11.2013, 12:32
Цитата Сообщение от Mif Посмотреть сообщение
Findall же делегат требует, верно?
требует.
C#
1
2
3
4
            new List<Process>(
                Process.GetProcesses()).FindAll(
                delegate(Process ps) { return (ps.ProcessName == "ps1" || ps.ProcessName == "ps1"); }
                    ).ForEach((Process ps) => ps.Kill());
0
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
05.11.2013, 13:08  [ТС]
Получается, что
Цитата Сообщение от ViterAlex Посмотреть сообщение
return (ps.ProcessName == "ps1" || ps.ProcessName == "ps1");
не сократить за счет генерации массива по месту? Требуется фильтровать по списку из нескольких значений (больше 3), что удлиняет код. Ну, тем не менее, элегантнее чем у меня.
Спасибо всем ответившим!
0
 Аватар для ViterAlex
8952 / 4864 / 1886
Регистрация: 11.02.2013
Сообщений: 10,246
05.11.2013, 13:20
Ну я только пример дал, а в делегат можешь засунуть всё, что угодно
0
5 / 5 / 1
Регистрация: 05.11.2013
Сообщений: 58
05.11.2013, 15:32  [ТС]
В итоге реализовал так:

C#
1
2
3
4
string[] procs  = {"usbd","init","bash"};
(from p in Process.GetProcesses()
                where procs.Contains(p.ProcessName)
                select(p)).ToList().ForEach(p => p.Kill());
Без именованного массива не обошлось, но вполне симпатично, имхо.
Спасибо еще раз за советы.

Добавлено через 17 минут
Вдогонку, то же для сервисов:

C#
1
2
3
4
string[] sc_to_stop = { "DCOM Server Process Launcher", "RPC Endpoint Mapper" };
(from sc in ServiceController.GetServices()
    where sc_to_stop.Contains(sc.DisplayName)
    select (sc)).ToList().ForEach(sc => sc.Stop());
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
08.11.2013, 02:32
Вот три способа:
C#
1
2
3
      Process.GetProcesses().Where(p => p.ProcessName == "ps1" || p.ProcessName == "ps1").Count(p => { p.Kill(); return true; });
      (new string[] { "ps1", "ps2" }).SelectMany(name => Process.GetProcessesByName(name)).Count(p => { p.Kill(); return true; });
      (new string[] { "ps1", "ps2" }).SelectMany(name => Process.GetProcessesByName(name)).ToList().ForEach(p => p.Kill());
А вообще, чем нормальный цикл не угодил?

Добавлено через 1 минуту
Цитата Сообщение от Mif Посмотреть сообщение
Требуется фильтровать по списку из нескольких значений (больше 3), что удлиняет код.
Используй словарь или сет.
0
1 / 1 / 0
Регистрация: 01.11.2013
Сообщений: 13
24.09.2019, 14:31
У меня не получилось, все ваши условия жесткие и фильтрация идет не по маске.
Вот мое решение:
C#
1
2
3
4
5
6
7
string[] exelist_aryy = new string[] { "note","cal" };
foreach (string ps in exelist_aryy)
   {
     (from p in Process.GetProcesses()
     where p.ProcessName.LastIndexOf(ps) != -1
     select p).ToList().ForEach(p =>  {p.Kill(); });
    }
В результате при нахождении Блокнота или Калькулятора они будут закрыты.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2019, 14:31
Помогаю со студенческими работами здесь

Process.Kill() при вылете программы с ошибкой
Здравствуйте Моя программа запускает процесс и работает с ним. При выходе из программы я убиваю процесс. Если программа вылетит с...

[SQL Server]Transaction (Process ID 55) was deadlocked on lock resources with another process and has been chosen as the deadlock viсtim.
1С 7.7, сервер win2003, 4 клиентские машины с ХР - на одной из них все время вылетает ошибка: SQL State: 40001 Native: 1205 ...

Как взять title, process, process id активного окна?
Хочу в этом switch, отловить title, process, process id. У меня есть 2 функции LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM...

О чем говорит ошибка "error The process cannot access the file *.tlog because it is being used by another process"?
Может кто встречался с этой ошибкой. Помогите избавиться от нее.

The process cannot access the file because it is being used by another process
Здравствуйте, столкнулся с проблемой. При компиляции кода в MSVS 12 выдаётся следующая ошибка: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru