Добавление даты в имя файла или папки — несложная задача. Интереснее становится, когда дату нужно записать строго в определённом формате. Из этой статьи вы узнаете, как задавать файлам и каталогам имена с датой в любом виде.
На днях мне пришлось решить небольшую задачку по наименованию резервных копий, наименование которых должно было содержать дату в формате yymmdd (две последних цифры года, две цифры месяца и две цифры дня). Используемая для создания резервных копия утилита, однако, такой формат даты в имени не поддерживает. Но поддерживает запуск исполняемых файлов до и/или после процедуры копирования. Поэтому решением стал cmd-файл (ну или bat, как вариант). Вот его пример:
set CURDATE=%date% ren C:\Backups\primer_%date%.zip d_%CURDATE:~8,2%%CURDATE:~3,2%%CURDATE:~0,2%_primer.zip set CURDATE=
Конечно, я заменил реальные имена файлов на условные. Теперь разберем что к чему. Сразу оговорюсь, что примеры в основном будут касаться файлов, но логика работы с каталогами точно такая же.
Для перевода дат в именах файлов я использовал значение текущей даты в Windows, которое записывается в виде dd.mm.yyyy. При этом отметим, что эта дата это десять символов (точки считаются), которые пронумерованы системой начиная с нуля.
Команда
set CURDATE=%date%
создаёт переменную CURDATE (от current date) и задаёт ей значение текущей даты. Имя переменной можно выбрать произвольно, хватит и любой буквы. Кроме того, переменную можно специально и не задавать, а использовать текущую дату. Но об этом позднее.
Далее идёт команда переименования ren (или rename). Можно использовать оба варианта написания команды. Синтаксис её выглядит так:
ren [путь_к_файлу]\[старое_имя_файла] [новое_имя_файла]
Ограничением команды rename является то, что при переименовании нельзя указать новый путь к файлу. То есть это именно переименование, а не копирование с новым именем и не перемещение с переименованием. Но, так как мне нужно было только переименовать файлы, этот вариант подходил. Далее также разберем и другие команды.
Теперь непосредственно о команде переименования:
ren C:\Backups\primer_%date%.zip d_%CURDATE:~8,2%%CURDATE:~3,2%%CURDATE:~0,2%_primer.zip
Как видим, мы берем файл primer_%date%.zip из каталога C:\Backups\ для переименования. Например, созданный сегодня файл будет иметь имя primer_07.11.2018.zip, а завтрашний primer_08.11.2018.zip. В нашем случае это ежедневные резервные копии. Новое имя, возможно, выглядит страшно и требует расшифровки.
%CURDATE:~8,2% — берем два символа из CURDATE, начиная с восьмого;
%CURDATE:~3,2% — берем два символа из CURDATE, начиная с третьего;
%CURDATE:~0,2% — берем два символа из CURDATE, начиная с нулевого.
Напомню, что CURDATE представляет собой последовательность из десяти символов, пронумерованных от нуля до девяти, и в общем виде представляет собой текущую дату в виде dd.mm.yyyy. Таким образом, в нашем примере:
два символа с восьмого — 18;
два символа с третьего — 11;
два символа с нулевого — 07.
В итоге, файл primer_07.11.2018.zip превращается в d_181107_primer.zip. Что касается буквы d, то это просто указатель ежедневной копии, который я оставил в примере, чтобы показать, что можно спокойно дописывать любые символы до и после формируемой нами даты.
В конце скрипта очистим значение CURDATE
set CURDATE=
Переменную можно было и не задавать. Тогда бы мы обошлись одной строкой:
ren C:\Backups\primer_%date%.zip d_%date:~8,2%%date:~3,2%%date:~0,2%_primer.zip
С другой стороны, если Вам не чуждо написание сложных команд, то лучше сразу заиметь привычку оперировать собственными переменными.
Как я уже говорил, вы можете записывать дату в имени файла по своему усмотрению не только при переименовании. Например, команда для создания каталога mkdir (или md):
set a=%date% md C:\%a:~3,2%%a:~0,2%
Здесь мы обозвали переменную не CURDATE, а просто a. Второй командой мы создали на диске C каталог с именем вида mmdd (месяц, день).
Переименование можно делать и командой move.
set CURDATE=%date% move primer.txt primer_%CURDATE:~0,2%_%CURDATE:~3,2%_%CURDATE:~6,4%.txt
Этими командами мы переименовали файл primer.txt в текущем каталоге в файл primer_07_11_2018.txt (при другой дате на календаре, конечно, будет другое имя). Думаю, синтаксис уже должен быть вам понятен: два символа с нулевого, два символа с третьего и четыре с шестого.
Но, вообще, команда move это, конечно, больше про перемещение файлов и папок. Конечно же, задавать имена с датой в любом формате можно и при перемещении.
Кстати, в самом первом примере мы находили нужным нам файл с датой в имени, которая была записана в правильной по российским нормам последовательности dd.mm.yyyy, но ведь она может быть записана и другим способом. Что если в имени файла у нас только месяц и последние две цифры года? А мы хотим поставить сначала год, потом месяц, да ещё и разделить их символом _ для лучшей читаемости.
set CURDATE=%date% ren primer%CURDATE:~3,2%%CURDATE:~8,2%.zip primer_%CURDATE:~8,2%_%CURDATE:~3,2%.zip
Как и в команде move, если путь к файлу или каталогу не задан явно, речь идёт о текущем каталоге. Ну и не забывайте очищать значение переменной (на самом деле, переменные, задаваемые командой set, действуют только на протяжении командной сессии, в которой они были заданы 😉 ).
Статьи по теме: