Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] netstat + tasklist Вся полезная информация в одном месте! [решено]

Ответить
Настройки темы
CMD/BAT - [решено] netstat + tasklist Вся полезная информация в одном месте! [решено]

Новый участник


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

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


netstat + tasklist Вся полезная информация в одном месте!

Всем привет, меня зовут Владислав, решил поделиться со всеми своими заметками, на днях написал...

Установил на компьютере apache и mysql, и надо был смотреть, в какой порт открыты приложения легко и быстро. Для того есть несколько конcольных команд в Windows
Обзор активных портов системы:
netstat -ano
Обзор запущенных процессов:
tasklist

И чтобы найти запущен ли, например MySql сервера, приходилось писать
tasklist | findstr mysql
А чтобы узнать его порт, делал поиск либо по PID, либо по слову LIST и порту 330.* (я знал в каких десятках открыт порт)
netstat -ano | findstr 1674
netstat -ano | findstr 33.*LIST

Но очень не удобно было запускать каждый раз по две этих команды, чтобы проверить
1. Запущен ли MySql сервер (или apache)
2. И на каком порту он висит

В виду этого было принято решение написать batch-файл, который бы предоставлял нам всю необходимую информацию за одну операцию. Спустя долгие часы отладки bat-ника и изучения этой предметной магии, батник был написан

Инструкция применения:
1. Создать папку c:\bin
2. сохранить код батника в c:\bin\task.bat
3. добавить путь c:\bin в переменную окружения PATH
4. теперь мы можем писать в консоли что-то вроде
task mysql
или
task apache

5. Вы хотите создать сверху свой батник, где запускаются несколько task, то вызывать их из батника следует командой
call task mysql
call task apache


Код bat-файла task.bat
Код: Выделить весь код
@echo off
rem ВНИМАНИЕ! УСТАНОВИТЕ ЭТУ ПЕРЕМЕННУЮ ТАКЖЕ КАК НАЗЫВАЕТСЯ ЭТОТ ФАЙЛ!  (если расширение .cmd или .bat, его можно не указывать)
set __FILENAME__=task

rem   Описание
rem   Данная команда выводит искомую строку из "tasklist" и оторажает связанный с ней порт из "netstat -ano"
rem   Входные параметры: %1 - часть строки для поиска
rem   Ограничение: если название программы в tasklist с пробелом, то пакет не сможет вывести netstat
rem   Примеры:
rem
rem   task mysql
rem   task http
rem
rem   Если вы пишите свой батник, то из него вызывать надо следующим образом (если вызвать без call,
rem   то выполнится только первая команда, пока не ясно почему)
rem   call task mysql
rem   call task apache
rem
rem   @author Владислав Вольнов
rem   @date 25.10.2011
rem  


rem Проверить, не вызван ли файл как спец. bat-ник
if "%~1"=="bat_find_task_list" (
    call :bat_find_task_list "%~2"
    goto :eof
)


goto begin
rem занятые метки циклов
rem forbegin1 forbegin2 forbegin3


rem Получить номер порта из строки netstat -ano
:get_port_from_netstat
    rem три вида строк, которы успешно обрабатываются данной функцией
    rem set str=UDP    [few0::91f3:bcea:1ab4:70e0%37]:1900  *:*
    rem set str=  UDP    [::]:3702              *:*
    rem set str=  UDP    192.168.56.1:1900      *:*
    set str=%~1
    rem echo %str%
    rem echo разделение
    for /f "delims=] tokens=1,2" %%i in ("%str%") do (
        if "%%j"=="" (
            for /f "delims=: tokens=2" %%a in ("%str%") do (
                for /f %%a in ("%%a") do (
                    rem echo port=%%a
                    set r1=%%a
                )
            )
        ) else (
            rem echo i=%%i
            rem echo j=%%j
            for /f "delims=:" %%a in ("%%j") do (
                for /f %%a in ("%%a") do (
                    rem echo port=%%a
                    set r1=%%a
                )
            )
        )
    )
goto :eof


rem Получить номер PID из указанной строки netstat -ano
:get_pid_from_netstat
    set str=%~1
    rem echo getPID %str%
    for /f "tokens=1,2,3,4,5" %%a in ("%str%") do (
    rem %%a %%b %%c %%d %%e
    if "%%e"=="" (
        rem echo getPID.r1=%%d
        set r1=%%d
    ) else (
        rem echo getPID.r1=%%e
        set r1=%%e
    )
    )
    rem echo getPID.r1=%r1%
goto :eof


rem Получить PID из строки tasklist
:get_pid_from_tasklist
    rem echo get_pid_from_tasklist %~1
    for /f "tokens=2" %%i in ("%~1") do set r1=%%i
    rem echo get_pid_from_tasklist.res=%r1%
goto :eof


rem Функция выполняющаяся, если вызвать текущий bat-файл с параметром %1 равным bat_find_task_list
:bat_find_task_list
    tasklist | findstr "%~1"
goto :eof


rem Вывести список программ, найденные по %1
:prn_find_tasklist
    set str=%~1
    rem echo prn_find_tasklist %str%
    rem echo NAME=%~0
    for /f "usebackq tokens=*" %%i in (`call %__FILENAME__% bat_find_task_list "%~1"`) do call :forbegin3 "%%i"
    goto :forend3
    :forbegin3
        rem echo for3body x1=%~1
        echo %~1
        call :get_pid_from_tasklist "%~1"
        rem echo for3body r1=%r1%
        call :prn_netstat_pid %r1%
        echo.
    goto :eof
    :forend3
goto :eof


rem Вывести строки с указанным портом из netstat -ano
:prn_netstat_port
    for /f "usebackq tokens=*" %%d in (`netstat -ano`) do call :forbegin1 "%%d" "%~1"
    goto :forend1
    :forbegin1
        rem echo str=%~1  port=%~2
        call :get_port_from_netstat "%~1"
        rem echo "%r1%"
        if "%r1%"=="%~2" (
            echo %~1
        )
    goto :eof
    :forend1
goto :eof


rem Вывести строки с указанным PID из netstat -ano
:prn_netstat_pid
    rem echo prn_netstat_pid %~1
    for /f "usebackq tokens=*" %%i in (`netstat -ano`) do call :forbegin2 "%%i" "%~1"
    goto :forend2
    :forbegin2
        call :get_pid_from_netstat "%~1"
        rem echo p=%~2 str=%~1 res=%r1%
        if "%r1%"=="%~2" echo %~1
        goto :eof
    :forend2
goto :eof



rem Основной код
:begin

echo.
call :prn_find_tasklist "%~1"

:eof
Также удобно в c:\bin поместить файл view.bat
Код файла view.bat
Код: Выделить весь код
@echo off
call task mysql
call task http
Теперь запуска команды view будет выводить на экран информацию вида
Код: Выделить весь код
mysqld.exe                    8176 Console                    1    42 408 КБ
TCP    0.0.0.0:3307           0.0.0.0:0              LISTENING       8176
TCP    [::]:3307              [::]:0                 LISTENING       8176


httpd.exe                     7404 Services                   0     4 620 КБ
TCP    127.0.0.1:81           0.0.0.0:0              LISTENING       7404
Удобно, не правда ли

Отправлено: 23:07, 24-10-2011

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] netstat + tasklist Вся полезная информация в одном месте! [решено]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] реализация tasklist и taskkill в одном батнике с меню выбора andman84 Скриптовые языки администрирования Windows 2 08-04-2010 19:26
Просто полезная информация Andrewkras Microsoft Windows NT/2000/2003 15 20-12-2009 10:03
Разное - Вся информация дублируется Vospen Microsoft Windows Vista 0 18-10-2009 15:56
HDD - [решено] Информация о свободном месте W03L Накопители (SSD, HDD, USB Flash) 3 21-02-2008 08:11
Просто полезная информация Andrewkras Microsoft Windows 2000/XP 9 18-10-2002 21:35




 
Переход