Cmd сравнить два файла по дате

Обновлено: 06.07.2024

Сравнивает два файла или набора файлов и отображает различия между ними.

Синтаксис

Параметры

Параметр Описание
/a Сокращает выходные данные сравнения ASCII. Вместо отображения всех строк, которые отличаются, FC отображает только первую и последнюю строку для каждого набора различий.
/b Сравнивает два файла в двоичном режиме, байт по байтам и не пытается повторно синхронизировать файлы после обнаружения несоответствия. Этот режим используется по умолчанию для сравнения файлов со следующими расширениями: .exe, com, .sys, obj, lib или bin.
/C Игнорирует регистр букв.
/l Сравнивает файлы в режиме ASCII, построчно и пытается повторно синхронизировать файлы после обнаружения несоответствия. Этот режим используется по умолчанию для сравнения файлов, за исключением файлов со следующими расширениями файлов: .exe, com, .sys, obj, lib или bin.
/лб <n> Задает число строк для внутреннего буфера строки равным N. Длина буфера строки по умолчанию составляет 100 строк. Если сравниваемые файлы содержат более 100 последовательных строк разной, FC отменяет сравнение.
/n Отображает номера строк во время сравнения ASCII.
"/OFF" [строка] Не пропускает файлы с установленным атрибутом "вне сети".
/t Предотвращает преобразование табуляций в пробелы с FC . Поведение по умолчанию заключается в том, что символы табуляции обрабатываются как пробелы, а для каждой восьмой позиции — остановка.
/U Сравнивает файлы как текстовые файлы в Юникоде.
/W Сжимает пробелы (т. е. знаки табуляции и пробелы) во время сравнения. Если строка содержит несколько последовательных пробелов или знаков табуляции, /w рассматривает эти символы как один пробел. При использовании параметра /w FC игнорирует пробелы в начале и конце строки.
/ <nnnn> Указывает число последовательных строк, которые должны совпадать после несоответствия, прежде чем FC считает файлы для повторной синхронизации. Если число совпадающих строк в файлах меньше nnnn, FC отображает соответствующие строки в виде различий. Значение по умолчанию — 2.
[<drive1>:][<path1>]<filename1> Указывает расположение и имя первого файла или набора сравниваемых файлов. требуется имя_файла1 .
[<drive2>:][<path2>]<filename2> Указывает расположение и имя второго файла или набора сравниваемых файлов. требуется имя_файла2 .
/? Отображение справки в командной строке.

Remarks

Эта команда имплеметед by c:\WINDOWS\fc.exe. Эту команду можно использовать в PowerShell, но не забудьте проделать полный исполняемый файл (fc.exe), так как "FC" также является псевдонимом для формата Custom.

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

Имя первого файла

Строки из имя_файла1 , отличные от файлов

Первая строка для сопоставления в обоих файлах

Имя второго файла

Строки из имя_файла2 различаются

Первая строка для сопоставления

/b выводит несоответствия, найденные во время двоичного сравнения в следующем синтаксисе:

Значение XXXXXXXX задает относительный шестнадцатеричный адрес для пары байтов, измеряемой от начала файла. Адреса начинаются с 00000000. Шестнадцатеричные значения для YY и ZZ представляют несовпадающие байты из имя_файла1 и имя_файла2 соответственно.

В имя_файла1 и имя_файла2 можно использовать подстановочные знаки (* и ?). Если в имя_файла1 используется подстановочный знак, FC сравнивает все указанные файлы с файлом или набором файлов, указанным параметром имя_файла2. Если в параметре имя_файла2 используется подстановочный знак, то FC использует соответствующее значение из имя_файла1.

Resynch failed. Files are too different.

При сравнении двоичных файлов, размер которых превышает объем доступной памяти, FC полностью сравнивает оба файла, наполняя участки памяти следующими частями от диска. Результат будет таким же, как и для файлов, которые полностью умещаются в памяти.

Примеры

Чтобы выполнить сравнение в ASCII двух текстовых файлов: Monthly. rpt и Sales. rpt, и отобразить результаты в сокращенном формате, введите:

Чтобы создать двоичное сравнение двух пакетных файлов, profits.bat и earnings.bat, введите:

Отобразятся результаты, аналогичные приведенным ниже.

Чтобы сравнить каждый файл .bat в текущем каталоге с файлом new.bat, введите:

Чтобы сравнить файловый new.bat на диске C с файлом new.bat на диске D, введите:

Чтобы сравнить каждый пакетный файл в корневом каталоге диска C с файлом с тем же именем в корневом каталоге на диске D, введите:

Сравнивает два файла или набора файлов и отображает различия между ними.

Синтаксис

Параметры

Параметр Описание
/a Сокращает выходные данные сравнения ASCII. Вместо отображения всех строк, которые отличаются, FC отображает только первую и последнюю строку для каждого набора различий.
/b Сравнивает два файла в двоичном режиме, байт по байтам и не пытается повторно синхронизировать файлы после обнаружения несоответствия. Этот режим используется по умолчанию для сравнения файлов со следующими расширениями: .exe, com, .sys, obj, lib или bin.
/C Игнорирует регистр букв.
/l Сравнивает файлы в режиме ASCII, построчно и пытается повторно синхронизировать файлы после обнаружения несоответствия. Этот режим используется по умолчанию для сравнения файлов, за исключением файлов со следующими расширениями файлов: .exe, com, .sys, obj, lib или bin.
/лб <n> Задает число строк для внутреннего буфера строки равным N. Длина буфера строки по умолчанию составляет 100 строк. Если сравниваемые файлы содержат более 100 последовательных строк разной, FC отменяет сравнение.
/n Отображает номера строк во время сравнения ASCII.
"/OFF" [строка] Не пропускает файлы с установленным атрибутом "вне сети".
/t Предотвращает преобразование табуляций в пробелы с FC . Поведение по умолчанию заключается в том, что символы табуляции обрабатываются как пробелы, а для каждой восьмой позиции — остановка.
/U Сравнивает файлы как текстовые файлы в Юникоде.
/W Сжимает пробелы (т. е. знаки табуляции и пробелы) во время сравнения. Если строка содержит несколько последовательных пробелов или знаков табуляции, /w рассматривает эти символы как один пробел. При использовании параметра /w FC игнорирует пробелы в начале и конце строки.
/ <nnnn> Указывает число последовательных строк, которые должны совпадать после несоответствия, прежде чем FC считает файлы для повторной синхронизации. Если число совпадающих строк в файлах меньше nnnn, FC отображает соответствующие строки в виде различий. Значение по умолчанию — 2.
[<drive1>:][<path1>]<filename1> Указывает расположение и имя первого файла или набора сравниваемых файлов. требуется имя_файла1 .
[<drive2>:][<path2>]<filename2> Указывает расположение и имя второго файла или набора сравниваемых файлов. требуется имя_файла2 .
/? Отображение справки в командной строке.

Remarks

Эта команда имплеметед by c:\WINDOWS\fc.exe. Эту команду можно использовать в PowerShell, но не забудьте проделать полный исполняемый файл (fc.exe), так как "FC" также является псевдонимом для формата Custom.

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

Имя первого файла

Строки из имя_файла1 , отличные от файлов

Первая строка для сопоставления в обоих файлах

Имя второго файла

Строки из имя_файла2 различаются

Первая строка для сопоставления

/b выводит несоответствия, найденные во время двоичного сравнения в следующем синтаксисе:

Значение XXXXXXXX задает относительный шестнадцатеричный адрес для пары байтов, измеряемой от начала файла. Адреса начинаются с 00000000. Шестнадцатеричные значения для YY и ZZ представляют несовпадающие байты из имя_файла1 и имя_файла2 соответственно.

В имя_файла1 и имя_файла2 можно использовать подстановочные знаки (* и ?). Если в имя_файла1 используется подстановочный знак, FC сравнивает все указанные файлы с файлом или набором файлов, указанным параметром имя_файла2. Если в параметре имя_файла2 используется подстановочный знак, то FC использует соответствующее значение из имя_файла1.

Resynch failed. Files are too different.

При сравнении двоичных файлов, размер которых превышает объем доступной памяти, FC полностью сравнивает оба файла, наполняя участки памяти следующими частями от диска. Результат будет таким же, как и для файлов, которые полностью умещаются в памяти.

Примеры

Чтобы выполнить сравнение в ASCII двух текстовых файлов: Monthly. rpt и Sales. rpt, и отобразить результаты в сокращенном формате, введите:

Чтобы создать двоичное сравнение двух пакетных файлов, profits.bat и earnings.bat, введите:

Отобразятся результаты, аналогичные приведенным ниже.

Чтобы сравнить каждый файл .bat в текущем каталоге с файлом new.bat, введите:

Чтобы сравнить файловый new.bat на диске C с файлом new.bat на диске D, введите:

Чтобы сравнить каждый пакетный файл в корневом каталоге диска C с файлом с тем же именем в корневом каталоге на диске D, введите:

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

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

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

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

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











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

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