- Форум на котором был найден скрипт - http://bit.ly/1aVkPnH
- Оригинальный скрипт - http://bit.ly/1epwxGO
- Измененный мной скрипт. Создает отчеты с именем лог-файла в виде даты и времени. - http://bit.ly/1jlQrXG
- Скрипт в кириллической кодировке - http://bit.ly/MA2HWi
Код: Выделить всё
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
mode con cols=80 lines=60
::Имя файла-протокола
rem @echo off
set dd=%DATE%
set tt=%TIME%
SET day=%dd:~0,2%
set month=%dd:~3,2%
set year=%dd:~6,4%
SET hour=%tt:~0,2%
SET minute=%tt:~3,2%
SET sec=%tt:~6,2%
echo %day% %month% %year% %hour% %minute% %sec%
Set LogFile=%day%%month%%year%_%hour%%minute%%sec%.log
::Мониторить каждые N секунд
Set Delay=2
::Исключаемые из обработки процессы
Set Exclude=tasklist.exe svchost.exe avp.exe wmiprvse.exe conhost.exe cmd.exe
Set Exclude=%Exclude% dllhost.exe SearchProtocolHost.exe SearchFilterHost.exe FlashPlayerUpdateService.exe
Set Exclude=%Exclude% taskeng.exe audiodg.exe GoogleUpdate.exe find.exe wmic.exe taskhost.exe
::Количество знаков табуляции между именем процесса и его PID
Set Tabulations=3
Set /A Delay+=1
:: Создаем массив исключаемых процессов
for %%a in (%Exclude%) do set Exclude.%%a=true
echo Сбор информации о процессах. Ждите...
echo ----------------------------
call :ProcessListSave
cls
echo Мониторинг начат
echo ----------------
:begin
::set /p x=.<nul
>nul ping 127.1 -n %Delay%
call :CheckProcesses
goto :begin
:ProcessListSave
::Массив ProcName.PID содержит имена процессов
::Массив ProcPID.N содержит номера PID, чтобы их можно было все перечислить
::Массив PIDPosition.PID содержит индексы, под которыми записаны PID,
:: для последующего создания массивов исключающей фильтрации
::Массив ProcUser.PID содержит пользователя, от имени которого запущен процесс
::Total содержит общее кол-во процессов
set Total=0
for /f "skip=2 tokens=1-2 delims=," %%a in ('tasklist /NH /FO:CSV') do (
if not defined Exclude.%%~a (
set /a Total+=1
set ProcName.%%~b=%%~a
call :GetProcessUserName "%%~a" "%%~b" "ProcUser"
set ProcUser.%%~b=!ProcUser!
set ProcPID.!Total!=%%~b
set PIDPosition.%%~b=!Total!
call :GetEchoTab "%%~a" %Tabulations% "%%~b !ProcUser!" "FormatText"
echo !FormatText!
rem echo %%~a %%~b !ProcUser!
)
)
exit /B
:CheckProcesses
call :ClearPIDPositionFlagsArray
for /f "skip=2 tokens=1-2 delims=," %%a in ('tasklist /NH /FO:CSV') do (
if not defined Exclude.%%~a (
rem если еще не было такого PID
if not defined ProcName.%%~b (call :LogNewProcess "%%~a" "%%~b") else (
rem если PID уже успел освободится и его место занял другой процесс (здесь была пасхалка :)
if "!ProcName.%%~b!" neq "%%~a" call :LogNewProcess "%%~a" "%%~b"
)
rem Создаем массив флагов позиций текущего слепка процессов
set PIDExist.!PIDPosition.%%~b!=true
)
)
::Проверяем, каких позиций не хватает с предыдущей записи
for /L %%C in (1,1,%Total%) do if not defined PIDExist.%%C call :LogClosedProcess "!ProcPID.%%C!" "%%C"
exit /b
:LogNewProcess
:: %1 - имя процесса
:: %2 - PID процесса
call :GetProcessUserName "%~1" "%~2" "ProcUser"
call :GetEchoTab "+ %~1" %Tabulations% "%~2 %ProcUser% %Time% %Date%" "FormatText"
echo %FormatText%
echo %FormatText%>> "%LogFile%"
set /a Total+=1
set ProcName.%~2=%~1
set ProcUser.%~2=%ProcUser%
set ProcPID.!Total!=%~2
set PIDPosition.%~2=!Total!
exit /B
:ClearPIDPositionFlagsArray
for /L %%C in (1,1,%Total%) do set PIDExist.%%C=
exit /B
:LogClosedProcess
::%1 - PID процесса
::%2 - Порядковый номер исключаемого процесса в массиве
set ProcName=!ProcName.%~1!
set ProcUser=!ProcUser.%~1!
call :GetEchoTab "- %ProcName%" %Tabulations% "%~1 %ProcUser% %Time% %Date%" "FormatText"
echo %FormatText%
echo %FormatText%>> "%LogFile%"
call :RebuildArrays "%~1" "%~2"
exit /B
:RebuildArrays
::Удаление элемента из массивов
::%1 - PID процесса
::%2 - Порядковый номер исключаемого процесса в массиве
set ProcName.%~1=
set ProcUser.%~1=
set PIDPosition.%~1=
set /A Total-=1
for /L %%C in (%~2,1,%Total%) do (
set /A NextPos=%%C + 1
call set ProcPID.%%C=%%ProcPID.!NextPos!%%
call set PIDPosition.%%ProcPID.!NextPos!%%=%%C
)
exit /B
:GetProcessUserName
:: возвращает пользователя, от чьего имени запущен процесс
:: %1 - Имя процесса
:: %2 - PID процесса
:: %3 - вых. переменная для хранения имени пользователя
for /f "tokens=2 delims==; " %%a in ('2^>nul WMIC Process WHERE Handle^="%~2" Call GetOwner ^| find /i "User ="') do (
set "%~3=%%~a"
)
Exit /B
:GetEchoTab
:: %1 - текст до табуляции
:: %2 - максимальное кол-во знаков табуляции в конце текста
:: %3 - текст после табуляции
:: %4 - вых. - переменная, в которую записывать результат преобразований
set "text=%~1"
set tabs=%~2
for /L %%C in (7,8,200) do (
if "!text:~%%C,1!" neq "" (set /A tabs-=1) else (goto ext_EchoTab)
)
:ext_EchoTab
if %tabs%==0 (set "text=%text% ") else (
for /L %%C in (1,1,%tabs%) do set "text=!text! ")
set "%~4=%text%%~3"
exit /B