Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Старожил


Сообщения: 415
Благодарности: 257

Профиль | Отправить PM | Цитировать


sov44, вот реализация на bat, столбцы ровные, с нумерацией, добавлен ведущий ноль, дубли процессов убраны. Слишком длинные имена обрезаются с добавлением троеточия, но когда скрипт запрашивает подтверждение на убийство процесса, его имя выводится полностью.

Сортировка выполнена через жопу, так пришлось сделать потому, что не хотелось отлавливать system и system idle из прошедшего вначале через sort списка.

Код: Выделить весь код
@Echo Off
SetLocal EnableDelayedExpansion

:Main
Set ProcessList=
rem Получаем список процессов без хлама, типа System и System Idle
For /F "skip=3 tokens=1 delims=," %%P In ('tasklist /FO CSV /NH') Do (
rem Убираем повторы, составляем список
	Echo !ProcessList!|Find ":%%~P:">nul||(
		Set ProcessList=!ProcessList!:%%~P:
		Set %%~P=MarkForSorting
	)
)

Set ProcessNum=0&Set Row=0&Set RowData=&Set DisplayNum=0
rem Жуткий костыль с сортировкой, но по другому не вышло бы из-за skip в
rem первом цикле
For /F "tokens=1 delims==" %%P In ('Set^|Sort^|Find "MarkForSorting"') Do (
rem Назначаем номер процессу
	Set /A ProcessNum+=1&Set ProcessNum!ProcessNum!=%%P
	Set Process=%%P
rem Добавление ведущего нуля
	If !ProcessNum! LSS 10 (Set DisplayNum=0!ProcessNum!) Else (Set DisplayNum=!ProcessNum!)
rem Максимальная ширина столбца-1
	If !Row! GTR 2 (
		Echo  !RowData!
		Set Row=1
		Call :Autowidth " !DisplayNum! !Process!"
		Set RowData=!String!
	) Else (
		Set /A Row+=1
		Call :Autowidth " !DisplayNum! !Process!"
		Set RowData=!RowData!!String!
	)
)
rem Вывод остатка строки
Echo  %RowData%

rem Удаление ненужных переменных
For /F "tokens=1 delims==" %%P In ('Set^|Find "MarkForSorting"') Do (Set %%P=)

Echo.
Set /P KillNum=Выберите номер процесса для завершения^> 
Echo.
Echo Вы точно хотите убить процесс #%KillNum% !ProcessNum%KillNum%! ?
Set /P Confirm=[Y\N]^> 
If /I %Confirm%==y (
	TaskKill /F /IM "!ProcessNum%KillNum%!"
rem Без этой задержки в списке иногда появлялись только что убитые процессы
	Ping -n 2 127.0.0.1>nul
	Echo.&Echo.
	GoTo Main
) Else (
	Echo.&Echo.
	GoTo Main
)

rem Автовыравнивание, обрезка длинного имени и добавление '...', если
rem имя процесса не влазит в ширину столбца
:Autowidth
Set String=%~1
If Not "%String:~25%"=="" Set String=%String:~,22%...
:Loop
If "%String:~25%"=="" Set String=%String% &GoTo Loop	
Exit /B

UPD:
Сделал автовыравнивание не на табах, как у меня было, а воспользовался советом Iska и дополнил пробелами.

Последний раз редактировалось Anonymоus, 22-05-2012 в 05:00.

Это сообщение посчитали полезным следующие участники:

Отправлено: 03:10, 22-05-2012 | #50