Войти

Показать полную графическую версию : Запись в лог русскими буквами.


i-Lex
14-09-2014, 10:38
Нужно вести лог, который находится в папке "C:\Soft\Other\Scripts\Logs\" примерно такого вида:

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

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

Georgio
14-09-2014, 11:44
Как-то так:


@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
Georgio, а можешь приписать, чтобы в папку нужную писал?

Georgio
14-09-2014, 12:21
@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
Georgio, почему не просто:
echo %date% %time:~0,5% Мама мыла раму
?

Georgio
14-09-2014, 15:53
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
Georgio, я как-то не вижу разницы... :unsure:

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

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

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

Georgio
14-09-2014, 18:11
Другой Ваш вариант выглядит чересчур надуманным. Отчего Вы так не любите простое «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
Сравнил:
E:\Песочница\0398>0001.cmd
::

E:\Песочница\0398>0002.cmd
::
Разницы не увидел ;). Поясню: у меня отложенное раскрытие задано по умолчанию на уровне реестра, посему пришлось во втором случае исправить на «setlocal disabledelayedexpansion» дабы увидеть. Увидел:
:: !!!Њ*¬* ¬л«* а*¬г!!!
но так и не понял Вашу мысль.

Georgio
14-09-2014, 20:59
но так и не понял Вашу мысль. »




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
Эм...
Какой из этих скриптов будет писать кириллицу и меньше будет проблем на Win 2003 ?

Georgio
15-09-2014, 08:20
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
Georgio, по посту #12 (http://forum.oszone.net/post-2402855-12.html) — так и не понял, в чём его преимущества по сравнению с кодом из #5 (http://forum.oszone.net/post-2402701-5.html).

kiripanda
15-09-2014, 21:19
Также могу предложить такие варианты: »
@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




© OSzone.net 2001-2012