Добавление даты в любом формате в имя файла или папки через cmd

Добавление даты в любом формате в имя файла или папки через cmdДобавление даты в имя файла или папки — несложная задача. Интереснее становится, когда дату нужно записать строго в определённом формате. Из этой статьи вы узнаете, как задавать файлам и каталогам имена с датой в любом виде.

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

Добавление даты в любом формате в имя файла или папки через cmd

Добавление даты в любом формате в имя файла или папки через cmd

Команда

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, действуют только на протяжении командной сессии, в которой они были заданы 😉 ).

Добавить комментарий

Ваш адрес email не будет опубликован.