Копирование файлов или каталогов (папок), в имени которых присутствует дата.
Как показала практика, на форуме возникают много вопросов, касающихся копирования файлов или каталогов (папок), в имени которых есть дата. Т е 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%
Надеюсь, что информация этого раздела помогла решить хотя бы часть проблем, связанных с копирование файлов или каталогов (папок), в имени которых присутствует дата. Если остались вопросы - задавайте их на форуме.
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь