Создание управляемых файлов журналов в пакетном задании

Я запускаю задание robocopy через пакетный файл, запуск которого запланирован каждый час. Я использую следующие переключатели:

Robocopy \servername\share D:\somedir /E /R:5 /Log+:D:\Logs\CopyLog.txt

Он работал верно в течение долгого времени, но сегодня утром он столкнулся с проблемой. Я пошел проверить файл журнала и был удивлен, обнаружив, что он вырос до 280 МБ.

Тогда мой вопрос заключается в том, как я могу изменить свой пакетный файл, чтобы писать более управляемые файлы журналов? Я думаю, было бы целесообразно добавить период, за который сообщается. То есть: CopyLog_201103.txt будет файлом журнала за март 2011 года.

Я неплохо разбираюсь в языках программирования более высокого уровня, но к тому времени, когда я рос, программирование командной строки уже давно ушло в прошлое. Я определенно узнаю ценность твердого понимания гораздо более основных компьютерных концепций.

Любые предложения/советы будут оценены, спасибо заранее.


person Curtis    schedule 16.03.2011    source источник


Ответы (2)


Вы можете получить день, месяц и год, используя этот фрагмент командной строки:

for /f "usebackq tokens=1-3 delims=/" %%d in ('%date%') do (
    set day=%%d
    set month=%%e
    set year=%%f
)

(Предупреждение: зависит от локали.)

Теперь вы можете писать в разные лог-файлы по своему усмотрению.

person bobbogo    schedule 16.03.2011
comment
@Curtis: Осторожно; вы не должны использовать этот метод в производственном коде, который должен работать на машинах, которые вы не контролируете, поскольку вам нужно знать формат даты, чтобы он работал. - person Joey; 17.03.2011
comment
@joey: Согласен. Кто-то указал эту команду как альтернативу: wmic os get localdatetime. (РЕДАКТИРОВАТЬ: ха! Я вижу, что это есть в вашем ответе ниже.) - person bobbogo; 17.03.2011
comment
Да ;-) Мне все еще нужно написать полезный скрипт вокруг него, но для одноразового быстрого и грязного подхода он работает довольно хорошо (с оговоркой, что он использует UTC, хотя я бы принял как должное в файлах журнала). Я был очень счастлив, когда обнаружил, что на самом деле это то, что позволяет получить текущую дату и время способом, не зависящим от локали (до этого я даже не знал, что это возможно в пакетных файлах). - person Joey; 17.03.2011

Уродливый способ (не рекомендуется, но необходим в Windows 2000 и более ранних версиях):

set MyDate=%DATE:-=%
set Filename=D:\Logs\CopyLog_%MyDate:~0,6%
robocopy ... /Log+:%Filename%

Примечание. Предполагается, что ISO-8601 является форматом краткой даты в вашей системе. Если это не так, вам нужно построить дату из подстрок %date%.

Защищенный от локали способ:

for /f "skip=1" %%d in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%d
set Filename=D:\Logs\CopyLog_%MyDate:~0,6%
robocopy ... /Log+:%Filename%
person Joey    schedule 16.03.2011