- Как можно работать с переменными среды %date% и %time% в коммандных файлах Windows .cmd / .bat
- CMD/BAT: работа с датой и временем в командной строке
- Сообщения 1
- 1 Тема от Rumata 2010-01-21 22:48:50 (изменено: Rumata, 2010-01-22 19:42:40)
- Тема: CMD/BAT: работа с датой и временем в командной строке
- Функции работы с датой и временем
- Функция, позволяющая вывести день недели на русском языке
- Добавление нескольких дней к текущему времени
- Реализация функции задержки
- Комментариев к записи: 17
- cmd дата и время
- 3 ответа
- Команда:
- Вывод:
- 26 ответов:
- региональный независимый разбор даты и времени
- примеры: (в cmd-скрипте используйте %% вместо %)
Как можно работать с переменными среды %date% и %time% в коммандных файлах Windows .cmd / .bat
Иногда требуется сформировать переменную даты и времени в cmd / bat скриптах windows так, как нужно нам, а не так, как нам отдаёт операционная система.
Например чтоб добавить эти данные в log файл, для фиксации времени или даты события, создать файл с именем, в котором должны фигурировать данные даты или времени (день, месяц, год, час, минуты, скунды, миллисекунды.) Да мало-ли, какие у нас задачи. Подключаем нашу фантазию 🙂
В следующем примере мы видим разбиение переменных по нужным нам шаблонам.
h- час 2 знака (то есть час будет выдаваться в следующем виде — 01, 02, . 09, . , 12, . 24)
m — минуты 2 знака
s — секунжы 2 знака
ms — миллисекунды 2 знака, почему-то от 0 до 99
dd — день 2 знака
mm — месяц 2 знака
yyyy — год 4 знака
Пример использования переменных %DATE% и %TIME% в скриптах cmd / bat Windows:
@echo off
set h=%TIME:
9,2%
set curtime=%h%:%m%:%s%:%ms%
set dd=%DATE:
3,2%
set yyyy=%DATE:
6,4%
set curdate=%dd%-%mm%-%yyyy%
set curdatetime=%curdate% %curtime%
echo Текущее время — %curdatetime%
В некоторых версиях Windows формат выдачи даты и времени другой, поэтому данный скрипт может работать совсем так как нам нужно.
По идее, подобным способом можно брать части любых переменных, суть в том что формат здесь такой:
Первая цифра после :
— это номер символа, с которого мы начинаем брать значение, вторая цифра это сколько символов захватывать.
Таким образом получается что мы можем взять для своих нужд любую часть, любой доступной нам переменной среды Windows.
Мне известны следующие переменные, значения которых мы можем получить:
CMD/BAT: работа с датой и временем в командной строке
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщения 1
1 Тема от Rumata 2010-01-21 22:48:50 (изменено: Rumata, 2010-01-22 19:42:40)
- Rumata
- Разработчик
- Неактивен
- Рейтинг : [ 31 | 0 ]
Тема: CMD/BAT: работа с датой и временем в командной строке
Эта тема родилась почти два года назад. Нам потребовалось самыми простыми средствами ТОЛЬКО командной строки получит временной слепок в формате ГГГГММДД_ччммсс (Год, Месяц, День, часы, минуты, секунды). В дальнейшем этот слепок предполагалось использовать в именах файлов для предотвращения путаницы в создаваемых однотипных файлах. Решение было найдено и использовалось некоторое время (решение опубликовано в виде статьи Подстановка текущих даты/времени в имя файла стандартными средствами командной строки Windows).
Впоследствии обнаружилась незавершенность алгоритма — ночное и утреннее время (промежуток между 00:00 и 10:00) в зависимости от региональных настроек может содержать ведущий пробел вместо нуля (» 9:59″ вместо «09:59»). Для исправления этой ошибки была добавлена одна строка, и алгоритм заработал вновь.
Примерно через год возникла необходимость вернуться к этому алгоритму, и был найден более простой вариант решения проблемы — подстановки даты и времени в имя файла. Появилась заметка Дата и время в имени файла (подстановка стандартными средствами командной строки Windows). В заметке описывается суть нового алгоритма, использующего особенности метода раскрытия переменных и свойства конструкции for /f. Рассмотрим каждый из них в отдельности. В конце будет показан еще один пример использования этой методики.Недостатки
Вначале хотелось бы сказать о существующих недостатках. Есть одна особенность, о которой следует помнить. Этот скрипт хорошо работает даже с таким форматом даты как М/Д/ГГГГ, например для даты 14 февраля 2010. Однако это никогда не проверялось, например, для дат неделей раньше. Об этом сказано в записи от 14 февраля 2009 на странице архива Роба ван дер Вуда. Однако в большинстве случаев это работает.Раскрытие переменных
Конструкции вида %VAR:str1=str2% указывают интерпретатору раскрыть значение переменной VAR и произвести замену всех подстрок str1 на str2 во всей строке. Это хорошая особенность, которой мы можем воспользоваться — переменная %TIME% может содержать ненужный нам ведущий пробел и нам необходимо заменить его нулемВ данном случае str1 — это пробел, str2 — символ «ноль». Поэтому между двоеточием и знаком равенства один пробел. На всякий случай аналогичное проделываем и с переменной DATE.
Конструкция for /f
В зависимости от региональных настроек порядок элементов даты может варьироваться. Например, у нас принят формат ДД.ММ.ГГГГ, в некоторых англоговорящих странах ММ.ДД.ГГГГ. Для решения нашей проблемы надо выбрать каждую часть времени и отсортировать в нужном нам порядке — разбить строку на части по разделителям (точка «.», пробел » «, слеш «/», запятая «,», тире «-«, двоеточие «:»), полученные части записать в переменные цикла и сохранить в нужном нам порядкеРассмотрим, как же эта конструкция поможет нам. for /f рассматривает входной поток (текстовая строка. файл на диске или вывод команды). В данном случае это строка, например дата и время создания этой темы 21.01.2010 21:48:50,23 (согласно настроек на моей системе). Эта строка анализируется и разбивается разделителями на отдельные фрагменты (токены).
Обратите внимание на пробел в списке разделителей — «/-. «. Так как входная строка содержит только целочисленную информацию, разделенную разделителями, то в строке всего 7 токенов.
Для того чтобы все токены были переданы внутрь цикла указываем количество и список токенов — «tokens=1-7», то есть все семь — с первого по седьмой. Чтобы все семь токенов попали в цикл на обработку будут выделено семь переменных цикла. В заголовке цикла указано имя первой переменной %%a. Следующие переменные получат последовательно имена %%b, %%c, %%d, %%e, %%f, %%g. В первую переменную %%a попадет первый токен, во вторую, %%b — второй токен, и т.д.
И так. В этом примере порядок следующий (работает на моем компьютере, у вас может быть другой)
— %%a — день
— %%b — месяц
— %%c — год
— %%d — часы
— %%e — минуты
— %%f — секунды
— %%g — сотые
Так как время 21.01.2010 21:48:50,23 из формата ДД.ММ.ГГГГ чч:мм:сс,сд надо перевести в формат ГГГГММДД_ччмм, надо взять значения переменных из списка выше в следующем порядке
— %%c — год
— %%b — месяц
— %%a — день
— %%d — часы
— %%e — минутыВ результате получим строку вида 20100121_2148.
Этот скрипт не универсальный, он системно-зависимый: порядок отдельных частей даты и времени зависит от текущих установок на компьютере (национальные, пользовательские настройки).
Aнализ текущего времени
На форуме был задан вопрос как проанализировать текущее время:. нужно в процессе выполнения скрипта проанализировать текущее время, если текущее время меньше 15:00 , то пропускаем (по goto) определённую строку (блок).
Используем раскрытие переменных с заменой подстроки — берем значение переменной TIME, производим замену пробела нулем и полученную строку сравниваем с заданной строкой времени. Так как сравнение производится лексикографически (википедия), то алгоритм выполнится корректно
Функции работы с датой и временем
Для работы с системной датой и временем используется библиотека time.h .
Типы, определенные в библиотеке time.h
Тип Описание size_t Целочисленный тип, возвращаемый операцией sizeof . clock_t Арифметический тип, подходящий для представления времени. time_t Арифметический тип, подходящий для представления времени. struct tm Структурный тип, содержащий компоненты календарного времени. Для определения текущего календарного времени используется функция
Данная функция возвращает время в секундах начиная с 1 января 1970 г.
Структура tm имеет вид
преобразует календарное время, указанное ptm , сохраняет его в структуре tm и возвращает указатель на нее.
осуществляет обратное преобразование.
Если время не доступно или не может быть представлено, возвращает (clock_t) (-1) .
копирует строку fmt в строку s , заменяя спецификаторы формата в fmt соответствующими данными, взятыми из содержимого структуры времени, на которое указывает tmpt ; в строку s помещается не более max символов.
Функция возвращает количество символов (исключая нулевой) в результирующей строке. Если результирующая строка (включая нулевой символ) содержит больше, чем max символов, функция возвращает 0, а содержимое s не определено.
Спец. Назначение %a Локальное сокращенное название дня недели %A Локальное полное название дня недели %b Локальное сокращенное название месяца %B Локальное полное название месяца %c Локальный разделитель даты и времени %d День месяца в виде десятичного числа (01-31) %D Эквивалент %m%d%y %e День месяца (десятичное число): однозначные числа дополнены пробелом %F Эквивалент %Y-%m-%d %g Последние два разряда года (00-99) %G Год в виде десятичного числа %H Часы (по 24-часовой шкале) в виде десятичного числа (00-23) %I Часы (по 12-часовой шкале) в виде десятичного числа (01-12) %j День года в виде десятичного числа (001-366) %m Месяц в виде десятичного числа (01-12) %n Символ новой строки %M Минуты в виде десятичного числа (00-59) %p Локальный эквивалент a.m./p.m. для 12-часовой временной шкалы %r Локальное 12-часовое время %R Эквивалент %H:%M %S Секунды в виде десятичного числа (00-61) %t Символ горизонтальной табуляции %T Эквивалент %H:%M:%S %u Номер дня недели (1-7), где 1 соответствует понедельнику %U Номер недели в году, считая воскресенье первым днем недели (00-53) %w Номер дня недели в виде десятичного числа, начиная с воскресенья (0-6) %W Номер недели в году, считая понедельник первым днем недели (00-53) %y Год без века в виде десятичного числа (00-99) %Y Год с веком в виде десятичного числа %z Смещение от UTC («-800» означает на 8 ч по Гринвичу западнее). %Z Наименование часового пояса (если доступно) %% % (то есть знак процента). Функция, позволяющая вывести день недели на русском языке
Результат выполнения
Добавление нескольких дней к текущему времени
Рассмотрим еще один пример. Допустим, требуется добавить несколько дней к текущей дате.
Реализация на СиРеализация функции задержки
Комментариев к записи: 17
#define _CRT_SECURE_NO_WARNINGS
#include
#include#define ADD_DAYS 300
#define BUFF_SIZE 40timer = time( NULL );
u = localtime(&timer);
strftime(s1, BUFF_SIZE, «%Y.%m.%d %H:%M:%S » , u);u->tm_mday += ADD_DAYS;
next = mktime(u);
u = localtime(&next);
strftime(s2, BUFF_SIZE, «%Y.%m.%d %H:%M:%S » , u);cmd дата и время
DATE и TIME имеют сходный формат командной строки и используются для отображения или изменения текущей даты или времени.
Формат командной строки DATE:
Команда DATE без параметров отображает текущую дату и запрашивает ввод новой даты. Для сохранения текущей даты нажмите клавишу ENTER.
Формат командной строки TIME:
Введите TIME без параметров для вывода текущего времени и запроса на ввод нового времени. Нажмите клавишу ENTER для сохранения текущего времени.
date — отобразить текущую дату. Результат:
Текущая дата: 28.09.2012
Введите новую дату (дд-мм-гг):Установить новое значение даты:
date /T 28.09.2012
Отобразить текущее время:
Или то же, но с интерактивным запросом:
Текущее время: 8:20:04,96
Введите новое время: 8:30Установить новое значение времени через параметр командной строки ( без запроса ):
Как я могу получить имя файла YYYY.MM.DD_HH.MM.SS.7z? Он должен работать с любыми региональными настройками!
3 ответа
Хорошо, когда этот вопрос является технически другим вопросом, ответ по существу тот же, что и другой вопрос:
Поскольку вы указали, что он должен работать с любыми региональными настройками, этот ответ не полностью отвечает вашим потребностям. Насколько я знаю, нет никакого способа удовлетворить ваши потребности изнутри cmd.exe. Я очень рекомендую сделать это в powershell вместо cmd.
Команда:
Вывод:
title Переименовать на дату и время
:: Chunks собраны здесь и amp; там».
:: Пакетное переименование 1 на 1 w. короткая задержка,
:: на сегодняшний день + время w. миллисекунды = >
:: Западно-европейские региональные настройки:
:: ОК. ЛЮБЫЕ региональные настройки:? .. Можете
:: require ‘env. замены переменных.
установить «source = 1_7z-orig-files-dir»
установить «target = 2_tmp»
если не существует «% target% » md «% target%»
если не существует «% source% *. 7z» goto END
Update: теперь, когда это 2016 год, я бы использовал PowerShell для этого, если только для этого нет действительно убедительной обратной совместимой причины, особенно из-за проблемы с региональными настройками с использованием date . См. @npocmaka по https://stackoverflow.com/a/19799236/8479
что такое оператор(ы) командной строки Windows, который я могу использовать для получения текущей даты и времени в формате, который я могу поместить в имя файла?
Я хочу иметь .bat-файл, который застегивает каталог на молнию архив с текущей датой и временем в составе имени, например, Code_2008-10-14_2257.zip . Есть ли простой способ сделать это, независимо от региональных настроек машины?
Я действительно не возражаю против формата даты, в идеале это было бы yyyy-mm-dd, но все просто отлично.
пока у меня есть это, что на моей машине дает мне Tue_10_14_2008_230050_91 :
Я могу жить с этим, но это кажется немного неуклюжим. В идеале это было бы короче и иметь упомянутый формат ранее.
Я использую Windows Server 2003 и Windows XP Professional. Я не хочу устанавливать дополнительные утилиты для достижения этой цели (хотя я понимаю, что есть некоторые, которые сделают хорошее форматирование даты).
26 ответов:
Если вы предпочитаете время в 24-часовом / военном формате, вы можете заменить вторую строку на эту:
Если вы хотите дату независимо от региона день/месяц заказа, вы можете использовать «WMIC os GET LocalDateTime» в качестве источника, так как он находится в ISO порядок:
C: тест>.cmd
Локальная дата-это [2012-06-19 10:23:47.048]региональный независимый разбор даты и времени
выходной формат %DATE% и dir команда зависит от региона и, следовательно, не является ни надежной, ни умной. дата.exe (часть UnxUtils) предоставляет любую информацию о дате и времени в любом мыслимом формате. Вы также можете извлечь информацию о дате / времени из любого файла с помощью date.exe .
примеры: (в cmd-скрипте используйте %% вместо %)
date.exe +»%Y%m%d %H%M%S: Any text»
20091222 185503: любой текстdate.exe +»Text: %y/%m/%d-any text-%H.%M»
Текст: 09/12/22-любой текст-18.55Command: date.exe +»%m-%d «»»%H %M %S «»»»
07-22 «18:55:03″`информация о дате / времени из файла ссылки:
date.exe -r c:file.txt +»The timestamp of file.txt is: %Y-%m-%d %H:%M:%S»используя его в сценарии CMD, чтобы получить информацию о годе, месяце, дне, времени:
использовать его в сценарии CMD, чтобы получить метку времени в любом требуемом формате:
извлечение информации о дате / времени из любого справочного файла.
добавление в файл информации о дате/времени:
дата.ехе часть свободных инструментов GNU которые не нуждаются в установке.
копирование date.exe в любой каталог, который находится в пути поиска может привести к сбою других сценариев, которые используют встроенный в Windows date команда.
еще два способа, которые не зависят от настроек времени (взято из : как получить данные / время независимо от локализации:). И как же сделать день недели, и ни один из них не требует разрешения администратора!:
MAKECAB — будет работать на каждой системе Windows (быстро, но создает небольшой временный файл) (скрипт foxidrive):
ROBOCOPY — это не родная команда для Windows XP и Windows Server 2003, но это может быть загружено с сайта microsoft. Но встроен во все, начиная с Windows Vista и выше:
и еще три способа, которые используют другие языки сценариев Windows. Они дадут вам больше гибкости, например, вы можете получить неделю в году, время в миллисекундах и так далее на.
JScript / batch гибрид (нужно сохранить как .bat ). JScript доступен в каждой системной форме NT и выше, как часть Windows Script Host (хотя можно отключить через реестр это редкий случай):
VSCRIPT / BATCH гибридный (можно ли внедрить и выполнить VBScript в пакетном файле без использования временный файл?) тот же случай, что и JScript, но гибридизация не так совершенна:
PowerShell — может быть установлен на каждой машине, которая имеет .NET-скачать с Microsoft ( v1, v2, v3 (только для Windows 7 и выше)). Он устанавливается по умолчанию на все Windows 7 и Windows Server 2008 и выше:
чтобы использовать его из пакета файл:
Самокомпилируется jscript.net/batch (никогда не видел машину Windows без .NET, поэтому я думаю, что это довольно портативный):
Логман это не может получить год и день недели. Он сравнительно медленный, а также создает временный файл и основан на отметках времени, которые logman помещает в свои файлы журналов. Он будет работать на все, начиная с Windows XP и выше. Наверное никогда не будет использоваться никем-включая меня-но это еще один способ.
еще один способ с WMIC который также дает неделю года и день недели, но не миллисекунды (для миллисекунд проверьте ответ foxidrive):
используя TYPEPERF С некоторыми усилиями, чтобы быть быстрым и совместимым с различными языковыми настройками и так же быстро, как возможно:
MSHTA позволяет вызывать методы JavaScript, аналогичные методу JScript, показанному в #3 выше. Имейте в виду, что свойства объекта даты JavaScript, включающие значения месяца, нумеруются от 0 до 11, а не от 1 до 12. Таким образом, значение 9 означает октябрь.
вот вариант из alt.рекламного.партия.nt, который работает локально-независимо.
поместите это в текстовый файл, например getDate.cmd
чтобы получить код для работы без ошибок msg в stderr, мне пришлось добавить одинарные кавычки вокруг назначений переменных для %%a, %%b и %%c. моя локаль (PT) вызывала ошибки на одном этапе в цикле/разборе, где выполнялись такие вещи, как «set =20». Котировки дают токен (хотя и пустой) для левой стороны оператор присваивания.
недостатком является беспорядочные имена переменных локали:’ yy’,’ mm ‘и’dd’. Но эй, какая разница!