Cmd вывести дату создания файла

Обновлено: 06.07.2024

Я использовал следующую команду, чтобы получить дату файла. Однако переменная fileDate возвращала пустое значение с тех пор, как мы переехали на другой сервер (Windows Server 2003).

Есть ли другой более надежный способ узнать дату файла?

Измените % на %% для использования в пакетном файле, для синтаксиса %

ta введите call /?

Ты можешь это сделать

Полезная ссылка для получения свойств файла с помощью командного файла, включая время последнего изменения:

Чтобы получить дату / время последнего изменения файла независимо от локали , вы можете использовать wmic команда с псевдонимом DataFile :

Обратите внимание, что должен быть указан полный путь к файлу и что все разделители путей (обратная косая черта \ ) должны быть здесь удвоены.

Чтобы получить значение даты / времени, используйте for /F , затем вы можно присвоить его переменной с помощью set :

Второй цикл for /F позволяет избежать артефактов (например, потерянных символов возврата каретки) при преобразовании вывода Unicode wmic в текст ASCII / ANSI с помощью первого цикла for /F (см. Также этот ответ).

Чтобы получить дату / время создания или дату / время последнего доступа, просто замените свойство LastModified на CreationDate или LastAccessed соответственно. Чтобы получить информацию о каталоге, а не о файле, используйте псевдоним FSDir вместо DataFile .

Чтобы указать пути / имена файлов (или каталогов), содержащие как , , так и ) , которые обычно не принимаются wmic , просмотрите этот вопрос.

Также ознакомьтесь с этот пост как а также этого, о том, как получить метки даты / времени файла и каталога.

У меня работает на Vista. Некоторые вещи, которые стоит попробовать:

Замените find полным путем команды find. find - это общее название инструмента. Есть находка для UNIX, которая сильно отличается от встроенной в Windows. вот так:
FOR /f %%a in ('dir ^|%windir%\system32\find.exe /i "myfile.txt"') DO SET fileDate=%%a

проверьте вывод команды в окне cmd.exe. Для этого вам нужно заменить %% на%.
FOR /f %a in ('dir ^|c:\windows\system32\find.exe /i "myfile.txt"') DO SET fileDate=%a
Это может дать вам некоторые идеи.

Если это отображается как пустое, снова в командной строке попробуйте следующее:

dir | c:\windows\system32\find.exe /i "myfile.txt"

Это должно показать вам то, что вам нужно увидеть.

Если вы все еще не можете понять это, отредактируйте свой пост, включив в него то, что вы видите с помощью этих команд, и кто-нибудь вам поможет.

Вы также можете получить дату изменения файлов, используя vbscript

Сохраните приведенное выше как mygetdate.vbs и в командной строке

/ T: C - время и дата создания
/ T: A - время и дата последнего доступа
/ T: W - Время и дата последней записи (по умолчанию)

Результат выполнения приведенной выше команды даст множество дополнительных сведений, которые вам, вероятно, не понадобятся, поэтому вы можете включить две команды FINDSTR для удаления пустых строк, а также любые ссылки на «Том», «Каталог» и «байты»:

Попытки включить цель пустой строки (/ c: «^ $» или «^ $») в одну команду FINDSTR не приводят к удалению пустых строк (или вызывают другие ошибки) при выводе результатов в текстовый файл.

Это более чистая команда:

Если вы можете использовать EXE, я рекомендую gdate.exe (из GNU CoreUtils для Windows). Он может указывать текущую дату или дату файла во многих различных форматах и ​​настраиваться. Я использую его, чтобы получить последнюю измененную дату и время файлов, которые я могу сравнить без какого-либо анализа (т.е. локально-независимый), используя %s (секунды с начала эпохи), необязательно с %N для получить наносекундную точность.

Какой вывод (точно) дает dir myfile.txt в текущем каталоге? Что будет, если установить разделители?

(обратите внимание на пробел после delims= )
(чтобы облегчить жизнь, вы можете сделать это из командной строки, заменив %%a на %a )

В числе системных переменных есть переменная %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. Для тех счастливых (часов не наблюдающих) и безмятежных людей, которые эксплуатируют эту или более ранние версии, упомяну, что работа с датой и механизм извлечения элементов даты будет несколько отличаться. На всякий случай приведу и его. Скорее для истории.
Не использовать для других операционных систем!

Rem Настройка даты под Windows 2000 rem День даты Set DD=%DATE:

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, то такие файлы будут не скопированы, а перемещены.

И еще одна возможность - скопировать файлы, возраст которых не превышает одного дня

Надеюсь, что информация этого раздела помогла решить хотя бы часть проблем, связанных с копирование файлов или каталогов (папок), в имени которых присутствует дата. Если остались вопросы - задавайте их на форуме.

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).

Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь

ti, но она указывает только на дату изменения файла. А как узнать именно дату создания файла?

Заработало следующим образом

можно, например, извлечь отсюда :


хотя гораздо проще сделать на PowerShell:

и не надо мучаться с обработкой результата dir

А как достать только одно значение? Без лишнего вывода
Это нужно будет потом в файл, в виде одной даты вывести.

Пробовал так:
FOR /f %%i IN ('DIR "%

1" /tc ^| FINDSTR /E "%%

2"
Но будут повторения, т.к. в директории будут похожие по названию файлы.
Есть тут возможность указать файл напрямую?

MaxDukov

Михаил: FOR /F "tokens=1,2 skip=5" %%i IN ('DIR %1 /tc ') DO (echo %%i %%j && exit 0)
- батнику на вход подаете имя файла, на выходе имеете дату и время. Если время не нужно, просто в echo уберите %%j Дату получить удалось, но с ней ещё возвращаются другие данные, 1 и 0 всегда. Как убрать и откуда это?

MaxDukov

Михаил: странно. Как выглядит вывод? Возможно, это код возврата. Попробуйте заменить на
FOR /F "tokens=1,2 skip=5" %%i IN ('DIR %1 /tc ') DO (echo %%i && goto END)
:END Макс: не помогло, вывод выглядит, примерно, так:
15.09.2015
1
0
17.09.2015
1
0

MaxDukov

Другой вариант :
for /F "tokens=1,2" %%i IN ('dir имяфайла /TC ^| find "имяфайла"') do set z=%%i %%j

Просто в выводе найдем строку с именем файла - получим одну строку, из которой извлечем токенами первые две части : дату и время.

MaxDukov

yellowmew: нашел, в чем проблема. DIR вываливает несколько строк.
например:
C:\2CB\ISA>dir /tc 1.cmd
Том в устройстве C имеет метку System
Серийный номер тома: C29D-3BB0

Содержимое папки C:\2CB\ISA

22/09/2015 12:12 264 1.cmd
1 файлов 264 байт
0 папок 380,115,738,624 байт свободно
параметр skip=5 отрезает лишние 5 верхних, с описанием тома. остаются 3 последние.
22/09/2015 12:12 264 1.cmd
1 файлов 264 байт
0 папок 380,115,738,624 байт свободно
token=1 вырежет только первый блок до пробела из КАЖДОЙ строки. т.е. если первое же echo в этом FOR не заканчивать выходом из цикла, то цикл в ледующий раз вернет 1(из строки 1 файлов . ), а потом 0 (0 папок . )











Эта тема родилась почти два года назад. Нам потребовалось самыми простыми средствами ТОЛЬКО командной строки получит временной слепок в формате ГГГГММДД_ччммсс (Год, Месяц, День, часы, минуты, секунды). В дальнейшем этот слепок предполагалось использовать в именах файлов для предотвращения путаницы в создаваемых однотипных файлах. Решение было найдено и использовалось некоторое время (решение опубликовано в виде статьи Подстановка текущих даты/времени в имя файла стандартными средствами командной строки 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, производим замену пробела нулем и полученную строку сравниваем с заданной строкой времени. Так как сравнение производится лексикографически (википедия), то алгоритм выполнится корректно

Читайте также: