- Cmd как вывести дату
- Синтаксис
- Параметры
- Примеры
- Cmd как вывести дату
- Определения названия дня недели по номеру дня в неделе.
- Удаление файлов с истекшим временем хранения
- CMD/BAT: работа с датой и временем в командной строке
- Сообщения 1
- 1 Тема от Rumata 2010-01-21 22:48:50 (изменено: Rumata, 2010-01-22 19:42:40)
- Тема: CMD/BAT: работа с датой и временем в командной строке
- Cmd как вывести дату
- Копирование файлов, в имени которых присутствует дата.
- Копирование в файл или каталог (папку), в имени которых присутствует дата.
- Копирование файлов по дате создания
Cmd как вывести дату
Отображает или задает системную дату. Если используется без параметров, Дата отображает текущий параметр системной даты и предлагает ввести новую дату.
Чтобы использовать эту команду, необходимо быть администратором.
Синтаксис
Параметры
Параметр | Описание |
---|---|
Устанавливает указанную дату, где Month — месяц (одна или две цифры, включая значения от 1 до 12), день — день (одна или две цифры, включая значения от 1 до 31), а year — год (две или четыре цифры, включая значения от 00 до 99 или от 1980 до 2099). Необходимо разделить значения для месяца, дня и года с точками (.), дефисами (-) или знаками косой черты (/). |
Примечание. Имейте в виду, что если для представления года используется 2 цифры, то значения 80-99 соответствуют 1980 – 1999.
Примеры
Если расширения команд включены, для вывода текущей системной даты введите:
Чтобы изменить текущую системную дату на 3 августа 2007, можно ввести любой из следующих элементов:
Чтобы отобразить текущую системную дату, после чего появится запрос на ввод новой даты, введите:
Для сохранения текущей даты и возврата в командную строку нажмите клавишу Ввод. Чтобы изменить текущую дату, введите новую дату и нажмите клавишу Ввод.
Источник
Cmd как вывести дату
Хотел бы обратить ваше внимание на то, что если в номере месяца, дня или данных времени присутствует ведущий ноль — он должен быть удален перед выполнением арифметических действий. Это делается потому, что в bat файлах числа (не строки!), начинающиеся с 0, считаются восьмеричными. Следовательно такие числа, как 08 и 09 не имеют смысла, так как цифр 8 и 9 нет в восьмеричной системе счисления.
Не забывайте об этом при арифметической обработке данных!
Вместо проверки и удаления ведущих нулей, учитывая, что эти числа меньше ста, можно использовать следующий прием:
Итак, рассмотрим некоторые примеры решения задач, связанных с обработкой даты и/или времени.
Определения названия дня недели по номеру дня в неделе.
Еще один вариант решения этой задачи:
Пример вызова аналогичен предыдущему.
Написать процедуру получения имени месяца по его номеру, думаю, уже не составит труда.
Удаление файлов с истекшим временем хранения
В следующем примере из заданной папки (OTKUDA) по требуемой маске (MASK) удаляются файлы, которые были созданы более определенного количества дней назад (N).
ta call :raschet !filedate:
0,10! days_to_date_of_file set /a raznitsa=%days_to_today%-!days_to_date_of_file! if !raznitsa! gtr %N% del /q «%%a» ) popd exit :raschet for /f «delims=. tokens=1-3» %%a in (‘echo %
1′) do ( set /a years=%%c*365+%%c/4 set /a prev_year=%%c-1 set /a result_year=%%c/4 set /a result_prev_year=!prev_year!/4 set /a vis=!result_year!-!result_prev_year! if !vis!==1 ( if %%b==01 set /a years=!years!-1 if %%b==02 set /a years=!years!-1 ) if %%b==01 set months=0 if %%b==02 set months=31 if %%b==03 set months=59 if %%b==04 set months=90 if %%b==05 set months=120 if %%b==06 set months=151 if %%b==07 set months=181 if %%b==08 set months=212 if %%b==09 set months=243 if %%b==10 set months=273 if %%b==11 set months=304 if %%b==12 set months=334 set days=%%a set firstsym=!days:
0,1! if !firstsym!==0 set days=!days:
Приведенный выше пример, который не содержит и 50 строк кода, показывает, что несмотря на то, что средства командного языка очень ограничены, его возможности позволяют писать не только самые простые сценарии.
Но целесообразность использования именного этого средства для конкретной задачи определять вам.
Посмотрел внимательно предыдущий пример и переделал его.
Теперь он не занимает и 40 строк. И, безусловно, его еще можно сократить! Если поставить именно такую цель. В данном же случае цель примеров — показать возможности и различные приемы написания bat файлов. По той же причине предыдущий пример пока не удалил, так как, на мой взгляд, он легче для понимания.
ta call :raschet !filedate:
0,10! days_to_date_of_file set /a raznitsa=%days_to_today%-!days_to_date_of_file! if !raznitsa! gtr %N% del /q «%%a» ) popd exit :raschet for /f «delims=. tokens=1-3» %%a in (‘echo %
1′) do ( set /a years=%%c*365+%%c/4 set /a prev_year=%%c-1 set /a result_year=%%c/4 set /a result_prev_year=!prev_year!/4 set /a vis=!result_year!-!result_prev_year! set numm=%%b if «!numm:
0,1!» == «0» set numm=!numm:
1,1! if !vis!==1 ( if !numm! LSS 3 set /a years=!years!-1 ) call :Day2Num !numm! months set days=%%a if «!days:
0,1!» == «0» set days=!days:
2=!years!+!months!+!days! ) exit /b 0 :Day2Num %d% day for /f «tokens=%1» %%I in ^ (‘echo 0 31 59 90 120 151 181 212 243 273 304 334’) ^ do set /a %2=%%I exit /b 0
В этом примере подпрограмма Day2Num в некоторой степени имитирует работу с массивом констант.))
Если же рассматривать практическую сторону задачи — удаление файлов старше определенного количества дней — то нельзя не упомянуть еще несколько способов решения задачи.
Утилита robocopy позволяет (среди прочего) перемещать файлы по условию, например, старше определенного количества дней. Непосредственно удалять эта утилита не позволяет, поэтому файлы по условию перемещаются во временную директорию, а уже оттуда отправляются на Небесный Независающий Сервер (командой del).
В приведенном участке кода из папки C:\source_folder удаляются файлы, возраст которых больше 7 дней.
В том же пакете Resource Kit, а начиная с Windows VISTA — как стандартный компонент, есть и более приспособленная для этого утилита — forfiles.
Надо заметить, что параметры этой программы. как бы так сказать. несколько нестандартные. Но ряд преимуществ, которые она дает, стоят того, чтобы в них разобраться. Для решения нашей задачи используется следующий вызов:
Подробнее о параметрах forfiles смотрите тут.
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь
Источник
CMD/BAT: работа с датой и временем в командной строке
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Сообщения 1
1 Тема от Rumata 2010-01-21 22:48:50 (изменено: Rumata, 2010-01-22 19:42:40)
- Rumata
- Разработчик
- Неактивен
- Рейтинг : [ 33 | 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, производим замену пробела нулем и полученную строку сравниваем с заданной строкой времени. Так как сравнение производится лексикографически (википедия), то алгоритм выполнится корректно
Источник
Cmd как вывести дату
В числе системных переменных есть переменная %date%, которая содержит текущую дату. Если в окне командного процессора ввести команду
то вывод будет примерно таким:
15.10.2014
Для получения отдельных значений номера дня, месяца и года используется операция извлечения подстроки. Так,выведет подстроку, начиная с 6-го символа (символы нумеруются, начиная с 0) т. е. для даты 15.10.2014 это будет 2014 — четырехзначный год. Это же значение можно получить и следующей командой —
— извлечь четыре последних символа из строки.
соответственно, выведет 14 — двухзначный год.
Можно по аналогии использовать два последних символа строкиРазличные варианты извлечения года мы рассмотрели. На очереди — день и месяц.
или это же можно записать так
выведет первые два символа строки — т. е. в данном случае номер дня. Ну и
извлечь два символа, начиная с третьего — выведет номер месяца.
Таким образом, для большей наглядности или если элементы даты используются в сценарии неоднократно, то можно использовать промежуточные переменные:
0,2% rem Месяц даты Set MM=%DATE:
3,2% rem Год даты [сокращенный] Set YY=%DATE:
8,2% rem Год даты [полный] Set YYYY=%DATE:
Следует все же отметить, что такой формат вывода даты используется в операционных системах более поздних, чем windows 2000. Для тех счастливых (часов не наблюдающих) и безмятежных людей, которые эксплуатируют эту или более ранние версии, упомяну, что работа с датой и механизм извлечения элементов даты будет несколько отличаться. На всякий случай приведу и его. Скорее для истории.
Не использовать для других операционных систем!3,2% rem Месяц даты Set MM=%DATE:
6,2% rem Год даты [сокращенный] Set YY=%DATE:
11,2% rem Год даты [полный] Set YYYY=%DATE:
Выше были рассмотрены различные варианты получение элементов даты в bat / cmd файлах. И теперь можно приступать собственно к работе с файлами и папками (каталогами), в именах которых присутствуют элементы даты.
Копирование файлов, в имени которых присутствует дата.
В bat / cmd файлах там, где необходимо присутствие дня, месяца или года мы будем использовать значения, которые мы рассмотрели в предыдущем параграфе. Перед выполнением команды вместо %date. % или переменной, если вы ее определили, произойдет подстановка соответствующих значений.
Например, необходимо скопировать файл, с именем даты в формате YYYYMMDD и расширением rar в в каталог backup.Если формат даты требуется такой — DDMMYY, то команда будет выглядеть так:
Или то же самое, если были определены переменные:
Копирование в файл или каталог (папку), в имени которых присутствует дата.
Довольно часто это так же используется и для создания архивов.
В приведенном примере создается архив с именем даты в формате YYYYMMDD.
Для проверки наличия и создания при необходимости каталога, в имени которого присутствует дата, можно использовать такой код:0,2% if not exist %PATHARHDAY% ( md %PATHARHDAY% )
Теперь в такой каталог можно копировать/перемещать файлы
(Здесь, как и в других примерах, не проверяется код возврата команды, что не всегда приемлемо при написании «боевых» сценариев).
Если источник и (или) приемник находятся на сетевом диске и адрес его начинается с двух слэшей, то необходимо использовать команду xcopy.Копирование файлов по дате создания
В некоторых случаях удобно копировать файлы, созданные (модифицированные) сегодня. Для этого даже нет необходимости знать их имена.
Конечно, можно написать собственный bat / cmd сценарий, который будет перебирать файлы требуемого каталога, извлекать дату создания файла, сравнивать с текущей и, при необходимости, копировать в каталог назначения. Но в операционной системе уже есть достаточно мощные средства, позволяющие выполнять такие действия. Их сейчас мы и рассмотрим.Все файлы созданные (модифицированные) сегодня будут скопированы из каталога d:\input в d:\output
Такая команда скопирует все файлы сегодня созданные из папки N:\arhive в папку M:\SUPERARHIVE.
Если в предыдущем примере вместо copy использовать команду move, то такие файлы будут не скопированы, а перемещены.И еще одна возможность — скопировать файлы, возраст которых не превышает одного дня
Надеюсь, что информация этого раздела помогла решить хотя бы часть проблем, связанных с копирование файлов или каталогов (папок), в имени которых присутствует дата. Если остались вопросы — задавайте их на форуме.
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь
Источник