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

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

Pank 28-11-2017 15:04 2780776

Логирование выполнения команд с датой и временем
 
Помогите с батником, который бы логировал выполнение команд в файл с датой и временем выполнения. Нарыл в интернете несколько примеров, но нормального результата пока получить не удалось, строки дублируются почему. Что я делаю не так?

bat
Код:

@echo off
setlocal enableextensions enabledelayedexpansion


call :OutLog "run bat"
call :Outf
call :OutLog "end bat"

endlocal
exit /b 0

:OutLog
        setlocal enableextensions enabledelayedexpansion
        set sLine=%~1
       
        for /f "usebackq delims=" %%i in (`date /t`) do set sDate=%%~i
        for /f "usebackq delims=" %%i in (`time /t`) do set sTime=%%~i
       
        >>"%date%.txt" <nul set /p sVar=%sDate%%sTime%
       
        if defined sLine (
                >>"%date%.txt" echo %sLine%
        ) else (
                >>"%date%.txt" echo.
        )
       
       
       
:Outf
        setlocal enableextensions enabledelayedexpansion
        set sLine1=%~1
       
        ::for /f "usebackq delims=" %%i in (`date /t`) do set tDate=%%~i
        ::for /f "usebackq delims=" %%i in (`time /t`) do set tTime=%%~i
        for /f "usebackq delims=" %%i in (`xcopy /y "U:\test1\07.log" "U:\test2"`) do set sCopy=%%~i
       
        >>"%date%.txt" <nul set /p sVar1=%sDate%%sTime% %sCopy%
       
        if defined sLine1 (
                >>"%date%.txt" echo %sLine1%
        ) else (
                >>"%date%.txt" echo.
        )
       
        endlocal
        exit /b



Результат в логе
28.11.2017 15:02 run bat
28.11.2017 15:02 Скопировано файлов: 1. run bat
Скопировано файлов: 1.
28.11.2017 15:02 end bat
28.11.2017 15:02 Скопировано файлов: 1. end bat

Iska 28-11-2017 15:45 2780788

Цитата:

Цитата Pank
Нарыл в интернете несколько примеров, но нормального результата пока получить не удалось, строки дублируются почему. Что я делаю не так? »

Пропустили при копировании существенную часть, посредством которой осуществляется возврат из первой процедуры. Посему при её вызове у Вас попутно исполняется и вторая :). Смотрите внимательнее на оригинал.

Pank 28-11-2017 16:15 2780795

Спасибо, навел на правильный путь :)
Если кто-будет искать, то вот что получилось:
Логирование команды с датой и временем
Код:

@echo off
setlocal enableextensions enabledelayedexpansion


call :OutLog "run bat"
TIMEOUT /T 2 /NOBREAK
call :Outf
TIMEOUT /T 3 /NOBREAK
call :OutLog "end bat"

endlocal
exit /b 0

:OutLog
        setlocal enableextensions enabledelayedexpansion
        set sLine=%~1
       
        for /f "usebackq delims=" %%i in (`date /t`) do set sDate=%%~i
        for /f "usebackq delims=" %%i in (`echo %time:~,-3%`) do set sTime=%%~i
       
        >>"%date%.txt" <nul set /p sVar=%sDate%%sTime%
       
        if defined sLine (
                >>"%date%.txt" echo %sLine%
        ) else (
                >>"%date%.txt" echo.
        )
       
        endlocal
        exit /b
       
       
:Outf
        setlocal enableextensions enabledelayedexpansion
        set sLine1=%~1
       
        for /f "usebackq delims=" %%i in (`date /t`) do set tDate=%%~i
        for /f "usebackq delims=" %%i in (`echo %time:~,-3%`) do set tTime=%%~i
        for /f "usebackq delims=" %%i in (`xcopy /y "U:\Паника\07.log" "U:\Мусор"`) do set sCopy=%%~i
       
        >>"%date%.txt" <nul set /p sVar1=%tDate%%tTime% %sCopy%
       
        if defined sLine1 (
                >>"%date%.txt" echo %sLine1%
        ) else (
                >>"%date%.txt" echo.
        )
       
        endlocal
        exit /b


Результат
28.11.2017 16:09:43 run bat
28.11.2017 16:09:45 Скопировано файлов: 1.
28.11.2017 16:09:55 end bat


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

Iska 28-11-2017 16:25 2780796

Цитата:

Цитата Pank
Если требуется логировать выполнение каждой команды(и не только на копирование), в указанном формате, то необходимо каждую команду оборачивать в процедуру или можно как то изящнее решить вопрос? »

Ключевое слово здесь — «в указанном формате». Если не требуется предваряющее дата/время, то можно банально перенаправить стандартный поток вывода в файл для всего пакетного файла целиком.

Pank 28-11-2017 16:29 2780798

Цитата:

Цитата Iska
Если не требуется предваряющее дата/время, то можно банально перенаправить стандартный поток вывода в файл для всего пакетного файла целиком. »

Нет, нужно именно чтобы дата-время потом результат команды.
Если использовать & то результаты выполнения команд идут на разных строках, нельзя сделать так чтобы выводилось одной строкой? Может какой-то другой выход есть?

Iska 28-11-2017 16:53 2780801

Цитата:

Цитата Pank
Если использовать & то результаты выполнения команд идут на разных строках, »

И если не использовать «&» — то тоже на разных.


Время: 17:08.

Время: 17:08.
© OSzone.net 2001-