Компьютерный форум 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=287927)

i-Lex 14-09-2014 10:38 2402602

Запись в лог русскими буквами.
 
Нужно вести лог, который находится в папке "C:\Soft\Other\Scripts\Logs\" примерно такого вида:

Код:

=======
14.09.2014  17:01 Началось обновление комплекта №1
14.09.2014  17:12 Завершилось обновление комплекта №1
=======

С написанием скриптов у меня очень плохо.
И как писать Кириллицу в логи я тоже не знаю.

Georgio 14-09-2014 11:44 2402631

Как-то так:


Код:

@echo off

>"example.log" (
echo =======
set /p="%date%  "<nul& @for /f %%i in ('time /t') do @echo %%i Началось обновление комплекта №1
start "" /wait "example.exe"
set /p="%date%  "<nul& @for /f %%i in ('time /t') do @echo %%i Завершилось обновление комплекта №1
echo =======
)

exit /b


.

i-Lex 14-09-2014 12:04 2402640

Georgio, а можешь приписать, чтобы в папку нужную писал?

Georgio 14-09-2014 12:21 2402647

Код:

@echo off

:: Полный путь к LOG-файлу:
>"C:\Soft\Other\Scripts\Logs\example.log" (
echo =======
set /p="%date%  "<nul& @for /f %%i in ('time /t') do @echo %%i Началось обновление комплекта №1

:: Пример запуска программы:
start "" /wait "D:\Test\example.exe"

set /p="%date%  "<nul& @for /f %%i in ('time /t') do @echo %%i Завершилось обновление комплекта №1
echo =======
)

exit /b


Iska 14-09-2014 14:25 2402701

Georgio, почему не просто:
Код:

echo %date% %time:~0,5% Мама мыла раму
?

Georgio 14-09-2014 15:53 2402740

Iska, смотрите:


Код:

@echo off

>"example.log" (
set /p="%date%  "<nul& for /f %%i in ('time /t') do echo %%i  Мама мыла раму.
timeout /t 60 /nobreak>nul
set /p="%date%  "<nul& for /f %%i in ('time /t') do echo %%i  Мама мыла раму.
)

exit /b


.



Результат:


Код:

14.09.2014  15:07  Мама мыла раму.
14.09.2014  15:08  Мама мыла раму.


.



И теперь смотрите:


Код:

@echo off

>"example.log" (
echo %date%  %time:~0,5%  Мама мыла раму.
timeout /t 60 /nobreak>nul
echo %date%  %time:~0,5%  Мама мыла раму.
)

exit /b


.



Результат:


Код:

14.09.2014  15:10  Мама мыла раму.
14.09.2014  15:10  Мама мыла раму.


.



То есть по-хорошему надо было использовать и "date /t".



Также могу предложить такие варианты:


Код:

@echo off

>"example.log" (
cmd /v:on /c echo !date!  !time:~0,5!  Мама мыла раму.
timeout /t 60 /nobreak>nul
cmd /v:on /c echo !date!  !time:~0,5!  Мама мыла раму.
)

exit /b


и


Код:

@echo off

>"example.log" (
call echo %%date%%  %%time:~0,5%%  Мама мыла раму.
timeout /t 60 /nobreak>nul
call echo %%date%%  %%time:~0,5%%  Мама мыла раму.
)

exit /b


.

i-Lex 14-09-2014 15:59 2402745

Georgio, я как-то не вижу разницы... :unsure:

Georgio 14-09-2014 16:13 2402756

i-Lex, просто в одном случае везде будет фигурировать только одно и то же время -- время запуска программы, а в других случаях время будет меняться, как это и положено.

Iska 14-09-2014 17:32 2402787

Georgio, так это тот же самый типичный случай — надо пользовать либо отложенное раскрытие переменных окружения и «!» вместо «%», либо двойной раскрытие переменных окружения через «call echo %%date%% %%time%% …». Второй вариант Вы озвучили.

Другой Ваш вариант выглядит чересчур надуманным. Отчего Вы так не любите простое «setlocal enableextensions enabledelayedexpansion»?

Georgio 14-09-2014 18:11 2402801

Цитата:

Цитата Iska
Другой Ваш вариант выглядит чересчур надуманным. Отчего Вы так не любите простое «setlocal enableextensions enabledelayedexpansion»? »



Iska, просто сравните:


Код:

:: !!!Мама мыла раму!!!

@echo off
chcp 1251>nul

setlocal enabledelayedexpansion

for /f "usebackq delims=" %%i in ("%~f0") do chcp 866>nul& echo %%i& endlocal& pause>nul& exit /b


и


Код:

:: !!!Мама мыла раму!!!

@echo off
chcp 1251>nul

:setlocal enabledelayedexpansion

for /f "usebackq delims=" %%i in ("%~f0") do chcp 866>nul& cmd /v:on /c echo %%i& pause>nul& exit /b


.

Iska 14-09-2014 18:22 2402805

Сравнил:
Код:

E:\Песочница\0398>0001.cmd
::

E:\Песочница\0398>0002.cmd
::

Разницы не увидел ;). Поясню: у меня отложенное раскрытие задано по умолчанию на уровне реестра, посему пришлось во втором случае исправить на «setlocal disabledelayedexpansion» дабы увидеть. Увидел:
Код:

:: !!!Њ*¬* ¬л«* а*¬г!!!
но так и не понял Вашу мысль.

Georgio 14-09-2014 20:59 2402855

Цитата:

Цитата Iska
но так и не понял Вашу мысль. »




Iska,
Код:

cmd /v:on /c
я использую, причём успешно, для сложного парсинга текста. И дело тут не только в восклицательных знаках, хотя это тоже немаловажно. Например, из нижеприведённых кодов пакетных файлов с поставленной задачей справится только код третьего пакетного файла, где используется как раз
Код:

cmd /v:on /c
.



Примеры:


1)
Код:

::  &  Мама мыла раму.

@echo off
chcp 1251>nul

setlocal enabledelayedexpansion

for /f "usebackq delims=" %%i in ("%~f0") do (
 set string=%%i|
 chcp 866>nul
 echo !string: =$!| findstr "^:"
 chcp 1251>nul
)

endlocal
pause>nul
exit /b

;


2)
Код:

::  &  Мама мыла раму.

@echo off
chcp 1251>nul

setlocal disabledelayedexpansion

for /f "usebackq delims=" %%i in ("%~f0") do (
 set string=%%i
 chcp 866>nul
 call echo %%string: =$%%| findstr "^:"
 chcp 1251>nul
)

endlocal
pause>nul
exit /b

;


3)
Код:

::  &  Мама мыла раму.

@echo off
chcp 1251>nul

setlocal disabledelayedexpansion

for /f "usebackq delims=" %%i in ("%~f0") do (
 set string=%%i
 chcp 866>nul
 cmd /v:on /c echo !string: =$!| findstr "^:"
 chcp 1251>nul
)

endlocal
pause>nul
exit /b

.

i-Lex 15-09-2014 07:40 2402961

Эм...
Какой из этих скриптов будет писать кириллицу и меньше будет проблем на Win 2003 ?

Georgio 15-09-2014 08:20 2402966

i-Lex, для Вашей задачи попробуйте так:


Код:

@echo off

:: Полный путь к LOG-файлу:
"C:\Soft\Other\Scripts\Logs\example.log"> (

echo =======
@(for /f %%i in ('date /t^& time /t') do @set /p="%%i  "<nul)& echo Началось обновление комплекта №1

:: Пример запуска программы:
start "" /wait "D:\Test\example.exe"

@(for /f %%i in ('date /t^& time /t') do @set /p="%%i  "<nul)& echo Завершилось обновление комплекта №1
echo =======
)

exit /b


.

Iska 15-09-2014 15:38 2403102

Georgio, по посту #12 — так и не понял, в чём его преимущества по сравнению с кодом из #5.

kiripanda 15-09-2014 21:19 2403257

Цитата:

Также могу предложить такие варианты: »
Код:

@echo off

:: Полный путь к LOG-файлу:
>>"Z:\Soft\Other\Scripts\Logs\example.log" (

echo =======
call :time Началось обновление комплекта №1

:: Пример запуска программы:
start "" /wait "D:\Test\example.exe"

call :time Завершилось обновление комплекта №1
echo =======
)

exit /b

:time
echo %date%        %time:~0,5%        %*
goto :eof



Время: 14:00.

Время: 14:00.
© OSzone.net 2001-