Навигация
Автор: Ильдар Шайморданов © 2008
Однажды мы задались вопросом: Как, используя встроенные средства командного интерпретатора Windows, вставить в имя файла текущую дату или время? Вопрос этот актуален - периодически возникает необходимость в выпуске новых патчей, которые удобно именовать по дате/времени сборки.
Стояла задача: Максимально автоматизировать подстановку искомых данных в имя файла стандартными средствами командной строки, не прибегая к помощи других утилит или языков программирования.
Пользователи unix-подобных систем находятся в более привилегированном положении - вставка в имя файла время текущего релиза выполняется стандартно, в одну строку, например:
jar -cf patch_`date +%Y%m%d_%H%M%S`.jar
Однако не всегда есть под рукой unix-машина, или работа выполнена на windows-машине. В результате изучения help-страниц команд было найдено простое, хотя несколько запутанное решение.
Последние версии Windows поддерживают динамические переменные окружения %DATE% и %TIME%, которые представляют информацию о текущих дате и времени в формате команд DATE и TIME, соответственно. Но задача была осложнена тем, что имя файла должно было содержать дату/время в формате ГГГГММДД_ччммсс.
set/?.
Следующие команды выводят дату и время, соответственно.
echo %DATE% echo %TIME%
После выполнения этих команд я получил следующие результаты (на момент написания).
12.01.2008 12:29:23,54
Как видим, дата выводится в формате ДД.ММ.ГГГГ, а время - чч:мм:сс,дс (дс - сотые доли секунды).
Полагаю, что такое представление не самое лучшее при именовании файлов.
Можно смело утверждать что формат вида ГГГММДД_ччммсс (или подобный) гораздо лучше и используется практически всегда.
Следующие действия приведут дату и время к требуемому формату.
Рассмотрим как можно удалить сотые доли секунды.
Запись %PATH:~n,m% выполняет выборку из переменной %PATH% m символов, начитая с символа n.
Если длина не указана, то полагается что будет использован остаток строки с n-го символа.
Если одно из чисел отрицательно, то они рассматриваются как смещение с левого или правого края. Все символы в строке нумеруются с нуля.
set now=%TIME:~0,-3%
Таким образом, данная команда выбирает только часть строки переменной %TIME%, за исключением последних трех символов.
В результате получится 12:29:23.
Необходимо избавиться от символов двоеточия (:).
Запись вида %PATH:str1=str2% производит замену всех подстрок str1 на str2 в значении переменной %PATH%. Пустое значение подстроки str2 приводит к удалению всех подстрок str1.
set now=%now::=%
В данном случае берется значение переменной %now% из предыдущего примера.
В нашем случае str1 равно второму двоеточию, а str2 - пустая строка. То есть, каждое двоеточие заменяется на пустую строку.
В результате получается 122923.
Следующая комбинация производит замену пробелов. Это необходимо, чтобы правильно отобразить ночное и утреннее время. На самом деле командный интерпретатор ранние часы до 10 представляет с ведущим пробелом (вместо привычного нуля).
set now=%now: =0%
Для выполнения этой операции необходимо взять три части, соответствующие году, месяцу и дню. Эта операция уже была рассмотрена ранее.
%DATE:~-4% (четыре символа с правого края. Результат - 2008)%DATE:~3,2% (два символа из середины, с учетом того, что нумерация начинается с нуля. Результат - 01)%DATE:~0,2% (два символа с левого края - то есть нулевой и первый. Результат - 12)Мы не можем выполнить простое удаление разделителей (символ «точка»), нам необходимо выполнить перестановку элементов даты. Поэтому этот шаг выглядит достаточно громоздко.
В данной статье было показано пошаговое решение проблемы подстановки текущих даты/времени в имена файлов в заданном формате. Ниже будет показано решение целиком. При необходимости его можно модифицировать с учетом текущих требований и возможных отличий в формате вывода, зависящих от локализации данного компьютера.
Если объединить все эти шаги воедино, получим рабочую строку %DATE:~-4DATE:~3,2DATE:~0,2%. Теперь можно показать весь пример полностью.
set now=%TIME:~0,-3% set now=%now::=% set now=%now: =0% set now=%DATE:~-4%%DATE:~3,2%%DATE:~0,2%_%now%
Первоначальные данные (ниже) были преобразованы и сохранены в переменной %now%, которую можно использовать в командных сценариях.
12.01.2008 12:29:23,54
Теперь переменная %now% хранит конечное значение 20080112_122923.
На момент написания статьи вызов сценария сгенерирует файл path_20080112_122923.jar (12 января 2008 года 12:29:23).
Дискуссия