Копирование файлов или каталогов (папок), в имени которых присутствует дата.

Как показала практика, на форуме возникают много вопросов, касающихся копирования файлов или каталогов (папок), в имени которых есть дата. Т е bat / cmd файл должен учитывать, что имя источника или (и) имя назначения не статичны. В них присутствуют элементы даты.
Для начала несколько слов о том, как мы будем получать элементы даты в bat / cmd файле.
Я умышленно изложил его, как мне кажется, излишне подробно, ориентируясь почти на начинающего "сценариста". Как раз из-за вопросов, которые задают в форуме и при переписке. Поэтому, если вам это знакомо - просто пропустите этот параграф. Или проверьте мои знания, способ изложения материала. Буду благодарен за конструктивную критику.

Получение элементов даты в bat / cmd файле

В числе системных переменных есть переменная %date%, которая содержит текущую дату. Если в окне командного процессора ввести команду

echo %date%


то вывод будет примерно таким:
15.10.2014
Для получения отдельных значений номера дня, месяца и года используется операция извлечения подстроки. Так,

echo %date:~6%


выведет подстроку, начиная с 6-го символа (символы нумеруются, начиная с 0) т. е. для даты 15.10.2014 это будет 2014 - четырехзначный год. Это же значение можно получить и следующей командой -

echo %date:~-4%


- извлечь четыре последних символа из строки.


echo %date:~8%


соответственно, выведет 14 - двухзначный год.
Можно по аналогии использовать два последних символа строки

echo %date:~-2%


Различные варианты извлечения года мы рассмотрели. На очереди - день и месяц.

echo %date:~0,2%


или это же можно записать так

echo %date:~,2%


выведет первые два символа строки - т. е. в данном случае номер дня. Ну и

echo %date:~3,2%


извлечь два символа, начиная с третьего - выведет номер месяца.


Таким образом, для большей наглядности или если элементы даты используются в сценарии неоднократно, то можно использовать промежуточные переменные:
rem День даты Set DD=%DATE:~0,2% rem Месяц даты Set MM=%DATE:~3,2% rem Год даты [сокращенный] Set YY=%DATE:~8,2% rem Год даты [полный] Set YYYY=%DATE:~6,4%


Следует все же отметить, что такой формат вывода даты используется в операционных системах более поздних, чем windows 2000. Для тех счастливых (часов не наблюдающих) и безмятежных людей, которые эксплуатируют эту или более ранние версии, упомяну, что работа с датой и механизм извлечения элементов даты будет несколько отличаться. На всякий случай приведу и его. Скорее для истории.
Не использовать для других операционных систем!

Rem Настройка даты под Windows 2000 rem День даты Set DD=%DATE:~3,2% rem Месяц даты Set MM=%DATE:~6,2% rem Год даты [сокращенный] Set YY=%DATE:~11,2% rem Год даты [полный] Set YYYY=%DATE:~9,4%


Выше были рассмотрены различные варианты получение элементов даты в bat / cmd файлах. И теперь можно приступать собственно к работе с файлами и папками (каталогами), в именах которых присутствуют элементы даты.

Копирование файлов, в имени которых присутствует дата.

В bat / cmd файлах там, где необходимо присутствие дня, месяца или года мы будем использовать значения, которые мы рассмотрели в предыдущем параграфе. Перед выполнением команды вместо %date...% или переменной, если вы ее определили, произойдет подстановка соответствующих значений.
Например, необходимо скопировать файл, с именем даты в формате YYYYMMDD и расширением rar в в каталог backup.

copy c:\my\%date:~6%%date:~3,2%%date:~0,2%.rar d:\backup\


Если формат даты требуется такой - DDMMYY, то команда будет выглядеть так:

copy c:\my\%date:~0,2%%date:~3,2%%date:~8%.rar d:\backup\


Или то же самое, если были определены переменные:

copy c:\my\%DD%%MM%%YY%.rar d:\backup\


Копирование в файл или каталог (папку), в имени которых присутствует дата.

Аналогично можно поступать если необходимо скопировать файл в каталог или файл, в имени котором присутствует дата.
copy c:\log\current.log c:\arh\%date:~0,2%%date:~3,2%%date:~8%.log


Довольно часто это так же используется и для создания архивов.

arj a c:\my\%date:~6%%date:~3,2%%date:~,2%.arj d:\a\*.*


В приведенном примере создается архив с именем даты в формате YYYYMMDD.
Для проверки наличия и создания при необходимости каталога, в имени которого присутствует дата, можно использовать такой код:

set PATHARHDAY=d:\arhive\%date:~6%%date:~3,2%%date:~0,2% if not exist %PATHARHDAY% ( md %PATHARHDAY% )


Теперь в такой каталог можно копировать/перемещать файлы
move d:\temparh\*.* %PATHARHDAY%\


(Здесь, как и в других примерах, не проверяется код возврата команды, что не всегда приемлемо при написании "боевых" сценариев).
Если источник и (или) приемник находятся на сетевом диске и адрес его начинается с двух слэшей, то необходимо использовать команду xcopy.

Копирование файлов по дате создания

В некоторых случаях удобно копировать файлы, созданные (модифицированные) сегодня. Для этого даже нет необходимости знать их имена.
Конечно, можно написать собственный bat / cmd сценарий, который будет перебирать файлы требуемого каталога, извлекать дату создания файла, сравнивать с текущей и, при необходимости, копировать в каталог назначения. Но в операционной системе уже есть достаточно мощные средства, позволяющие выполнять такие действия. Их сейчас мы и рассмотрим.

xcopy d:\input d:\output /D:%date:~3,2%-%date:~0,2%-%date:~8%


Все файлы созданные (модифицированные) сегодня будут скопированы из каталога d:\input в d:\output

FORFILES /P N:\arhive /D %DATE% /C "cmd /c copy @path M:\SUPERARHIVE"


Такая команда скопирует все файлы сегодня созданные из папки N:\arhive в папку M:\SUPERARHIVE.
Если в предыдущем примере вместо copy использовать команду move, то такие файлы будут не скопированы, а перемещены.

И еще одна возможность - скопировать файлы, возраст которых не превышает одного дня

robocopy "d:\input" "d:\output" /maxage:1




Или так
robocopy "d:\input" "d:\output" /maxage:%date:~6%%date:~3,2%%date:~0,2%


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

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).






  TopList Rambler Top100 my counter Valid XHTML 1.0 Strict Valid CSS Rambler Top100

Фитотерапия Молитвы Водолечение Юмор Форум Кладовка link О авторе

Фитотерапия Молитвы Водолечение Юмор Форум Кладовка Ссылки О авторе Отправить сообщение Карта сайта Поиск по сайту Главная страница

Copyright © 1999 - 2017  Бронислав Краснер