forum.wfido.ru

forum.wfido.ru (https://forum.wfido.ru/index.php)
-   ARC2.KLG.SOFTHARD (https://forum.wfido.ru/forumdisplay.php?f=141)
-   -   Скрипт / Помощь в написании (https://forum.wfido.ru/showthread.php?t=57367)

Bogdan Spasennikov 09.10.2018 15:34

Скрипт / Помощь в написании
 
Bogdan Spasennikov написал(а) к All в Jan 07 03:59:12 по местному времени:

Доброе время суток, All !

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

2006[b]12_29_00[/b]mainchat.log
2006[b]12_29_01[/b]mainchat.log
2006[b]12_29_02[/b]mainchat.log
2006[b]12_29_03[/b]mainchat.log

Т.е. имя в формате yyyy[b]mm_dd_hh[/b]mainchat.log, где hh - час (00..23). Требуется из пакетного файла собрать все эти файлы по-порядку в единый mainchat.log (за один день). Т.к. кроме языка командного интерпретатора cmd.exe я больше ничем не владею (имеются ввиду всякие там VBScript и прочие), то набросал следующее:

for /l %%n in (0,1,9) do (
FOR /F "usebackq tokens=1-3 delims=." %%i IN (`echo %date%`) DO type "%%k[b]%%j_%%i_0%%n[/b]mainchat.log" >> "mainchat.log"
)

for /l %%n in (10,1,23) do (
FOR /F "usebackq tokens=1-3 delims=." %%i IN (`echo %date%`) DO type "%%k[b]%%j_%%i_%%n[/b]mainchat.log" >> "mainchat.log"
)

В первом цикле, как видно, "пробегаются" часы от 00 до 09, во втором от 10 до 23, разбиение на два цикла сделано потому, что я не придумал как по-другому подставить лидирующий ноль в имени файла для часов < 10. Все это запускается в планировщике в 23:59, соответственно в %date% мы имеем текущую дату и mainchat.log собирается за текущий день 00:00-23:59, но есть одно но. Иногда система бывает загружена и bat'ник запускается не в 23:59, а с небольшим опозданием, например в 00:00:01, тогда mainchat.log не собирается из кусков ... т.к. за эту дату логи по часам еще не писались. Как бы дописать его, чтобы логи собирались не за текущую дату, а за предыдущую?

С уважением, Bogdan !

( ) E-Mail: twilight_zone(at)mail.ru, ICQ# 977-628
--- GoldED+/W32-MSVC 1.1.5-20060917 (WinNT 5.1.2600-SP2 iP-IV)

Pavel Povarov 09.10.2018 15:34

Скpипт / Помощь в написании
 
Pavel Povarov написал(а) к Bogdan Spasennikov в Jan 07 09:53:04 по местному времени:

Добpое вpемя сyток, Bogdan!

Втоpник 30 Янваpя 2007 03:59, Bogdan Spasennikov -> All:

[ skiped ]
BS> for /l %%n in (0,1,9) do (
BS> FOR /F "usebackq tokens=1-3 delims=." %%i IN (`echo %date%`) DO
BS> type "%%k[b]%%j_%%i_0%%n[/b]mainchat.log" >> "mainchat.log"
BS> )
BS>
BS> for /l %%n in (10,1,23) do (
BS> FOR /F "usebackq tokens=1-3 delims=." %%i IN (`echo %date%`) DO
BS> type "%%k[b]%%j_%%i_%%n[/b]mainchat.log" >> "mainchat.log"
BS> )
[ skiped ]

А ты можешь датy не каждый pаз в цикле считывать, а в начале скpипта записать в какyю-нибyдь пеpеменнyю?
И потом yже датy из этой пеpеменной использовать.
(Может я конечно глyпость сказал, т.к. в cmd-скpиптах не силён. Но выход мне видится такой.)

С yважением, Павел.

... Мы тyт водкy пьянствyем и голых женщин pаздеваем ...
--- GoldED+/W32 1.1.4.7

Bogdan Spasennikov 09.10.2018 15:34

Скpипт / Помощь в написании
 
Bogdan Spasennikov написал(а) к Pavel Povarov в Jan 07 13:18:18 по местному времени:

Доброе время суток, Pavel !

Помнится 30 Янв 07 09:53, Pavel Povarov писал к Bogdan Spasennikov:

PP> А ты можешь датy не каждый pаз в цикле считывать, а в начале скpипта
PP> записать в какyю-нибyдь пеpеменнyю? И потом yже датy из этой
PP> пеpеменной использовать. (Может я конечно глyпость сказал, т.к. в
PP> cmd-скpиптах не силён. Но выход мне видится такой.)
Вчерашнюю дату средствами только пакетных файлов не могу, могу только сегодняшнюю, которая из %date% берется. Вообщем так или иначе вышел из ситуации, правда как-то коряво получилось (если все это переписать на VBScript будет смотреться гораздо изящнее, сейчас этим времени заниматься нет), но зато работает:

Так мы получаем вчерашнюю дату в %yesterday%:

FOR /F "tokens=*" %%A IN ('cscript D:\ftn_2\yesterday.vbs //nologo') DO set %%A

Дальше используем ее в этих двух циклах:

for /l %%n in (0,1,9) do (
FOR /F "tokens=1-3 delims=." %%i IN ("%yesterday%") DO type "%%k[b]%%j_%%i_0%%n[/b]mainchat.log" >> "mainchat.log"
)

for /l %%n in (10,1,23) do (
FOR /F "tokens=1-3 delims=." %%i IN ("%yesterday%") DO type "%%k[b]%%j_%%i_%%n[/b]mainchat.log" >> "mainchat.log"
)

А вот и текст скрипта для получения вчерашней даты (результатом его работы является строка вида 'yesterday=dd.mm.yyyy', соответственно когда в вышеприведенном цикле переменная yesterday при выполнении set %%A принимает это значение):

' Yesterday.vbs, Version 1.01 for Windows Script Нost 2.00
' Display today's and yesterday's date in two formats
'
' Written by Rob van der Woude
' [url]http://www.robvanderwoude.com[/url]

' Specify header
strНead = "Format: YYYYMMDD (DD/MM/YYYY)" & Chr(13) & Chr(10) & _
"==================================" & Chr(13) & Chr(10)

' Get current year
strYear = DatePart("yyyy",Date)

' Get current month, add leading zero if necessary
If DatePart("m",Date) < 10 Then
strMonth = 0 & DatePart("m",Date)
Else
strMonth = DatePart("m",Date)
End If

' Get current day, add leading zero if necessary
If DatePart("d",Date) < 10 Then
strDay = 0 & DatePart("d",Date)
Else
strDay = DatePart("d",Date)
End If

' Format output for today
strToday = "Today: " & strYear & strMonth & strDay & " (" & _
strDay & "/" & strMonth & "/" & strYear & ")" & Chr(13) & Chr(10)

' Calculate yesterday's date
dtmYesterday = DateAdd("d",-1,Date)

' Get yesterday's year
strYear = DatePart("yyyy",dtmYesterday)

' Get yesterday's month, add leading zero if necessary
If DatePart("m",dtmYesterday) < 10 Then
strMonth = 0 & DatePart("m",dtmYesterday)
Else
strMonth = DatePart("m",dtmYesterday)
End If

' Get yesterday's day, add leading zero if necessary
If DatePart("d",dtmYesterday) < 10 Then
strDay = 0 & DatePart("d",dtmYesterday)
Else
strDay = DatePart("d",dtmYesterday)
End If

' Format output for yesterday
'strYest = "Yesterday: " & strYear & strMonth & strDay & " (" & _
' strDay & "/" & strMonth & "/" & strYear & ")"

strYest = "yesterday=" & strDay & "." & strMonth & "." & strYear

' Display the result
' Wscript.Echo( strНead & strToday & strYest )

Wscript.Echo( strYest )

С уважением, Bogdan !

( ) E-Mail: twilight_zone(at)mail.ru, ICQ# 977-628
--- GoldED+/W32-MSVC 1.1.5-20060917 (WinNT 5.1.2600-SP2 iP-IV)


Текущее время: 21:36. Часовой пояс GMT +4.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot