Forfiles копирование только новых файлов

Обновлено: 06.07.2024

Здравствуйте. Задача состоит в следующем:
На диске X:\ формируются файлы с расширением bak. Нужно в папку Y каждый день копировать только новые файлы (к примеру bat-файл запустится в 8 утра и должен скопировать файлы за сегодняшнее число).
Спасибо.

2 Ответ от smaharbA 2012-09-10 14:09:03 (изменено: smaharbA, 2012-09-10 14:13:57)

если без подпапок и дата создания совпадает с датой модификации

echo off
set s=y:\*.bak
set d=%homedrive%\моя папка\куда копирую\
mkdir "%y%" > nul 2>&1
xcopy /d:%date:

а так есть для этих целей forfiles

3 Ответ от angelraven 2012-09-10 14:31:30

если без подпапок и дата создания совпадает с датой модификации

Дата создания и модификации не совпадают. Файлы перезаписываются, поэтому дата создания не меняется.

4 Ответ от smaharbA 2012-09-10 14:49:54

пример копирует все с датой модификации равной или позднее текущей

5 Ответ от smaharbA 2012-09-10 15:27:04

если интересует именно дата создания, то либо forfiles либо примерно так

6 Ответ от angelraven 2012-09-10 16:04:05

7 Ответ от yuriy2000 2012-09-11 21:03:55

если файлы копируются/создаются на диске X:, то можно использовать атрибут "Архивный"

скопировать все файлы с расширением .BAK и с атрибутом "Архивный" с диска X: на диск Y:

можно запускать сколько угодно раз в день - будут копироваться только "новые" файлы.

из Справки XCOPY

/M Копирует файлы только с атрибутом "Архивный",
при этом атрибут "Архивный" отключается.

8 Ответ от angelraven 2012-09-12 08:25:05 (изменено: angelraven, 2012-09-12 08:34:26)

если файлы копируются/создаются на диске X:, то можно использовать атрибут "Архивный"

скопировать все файлы с расширением .BAK и с атрибутом "Архивный" с диска X: на диск Y:

можно запускать сколько угодно раз в день - будут копироваться только "новые" файлы.

из Справки XCOPY

/M Копирует файлы только с атрибутом "Архивный",
при этом атрибут "Архивный" отключается.

Интересная мысль! Попробуем. Спасибо большое. Я еще попробовал вариант с использованием robocopy, это конечно не совсем cmd но раз уж она присутствует в системах начиная с Vista, почему бы и нет. В robocopy реализованы простые команды и параметры именно для копирования.
В моем случае код выглядит так:

Подключаем сетевой диск O:, копируем туда файлы не старее одного дня (/MAXAGE:1). Затем отключаем сетевой диск. Можно не использовать сетевой диск а указывать сразу путь для копирования \\имя компьютера\расшаренная папка

    Команда FORFILES является удобным средством выполнения заданных команд для группы файлов в пакетных заданиях.

Формат командной строки:

FORFILES [/P путь] [/M маска_поиска] [/S] [/C команда] [/D [+ | -] ]

Параметры командной строки:

/P путь - Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.).
/M маска_поиска - Поиск файлов с помощью маски. Маска поиска по умолчанию "*" .
/S - Рекурсивное выполнение программы forfiles во всех подпапках, аналогично "DIR /S".
/C команда - Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки.

Команда по умолчанию - "cmd /c echo @file" .

Следующие переменные могут использоваться в строке команды:

@file - возвращает имя файла.
@fname - возвращает имя файла без расширения.
@ext - возвращает только расширение имени файла.
@path - возвращает полный путь к файлу и его имя.
@relpath - возвращает относительный путь к файлу.
@isdir - возвращает значение "TRUE", если типом файла является папка, и "FALSE" для файлов.
@fsize - возвращает размер файла в байтах.
@fdate - возвращает дату последнего изменения файла.
@ftime - возвращает время последнего изменения файла.

Для включения специальных символов в строку команды следует использовать шестнадцатеричный код символа в формате 0xHH (например, 0x09 для кода символа табуляции).

Перед внутренними командами CMD.exe необходимо ставить "cmd /c" .
/D дата - Выбор файлов, у которых дата последнего изменения больше или равна (+) либо меньше или равна (-) указанной дате при использовании формата "dd.MM.yyyy"; либо файлов, у которых дата последнего изменения больше или равна (+) текущей дате плюс "dd" дней либо меньше или равна (-) текущей дате минус "dd" дней. Допустимым числом дней "dd" является любое число в диапазоне 0 - 32768. "+" используется по умолчанию, если знак не указан.

/? - Вывод справки по использованию.

Примеры использования команды FORFILES

/? - Вывод справки по использованию.

FORFILES - отобразить список файлов текущего каталога. Команда с параметрами по умолчанию аналогична команде:

forfiles /P . /M * /C "cmd /c echo @file"

Допускается использование записей –p вместо /p - forfiles -P . -M * -C "cmd /c echo @file"

forfiles /M *.exe /C "cmd /c echo @file" | more - отобразить список файлов текущего каталога с расширением .exe в постраничном режиме вывода на экран.

forfiles /M *.exe /C "cmd /c echo @file" > list_exe.txt - то же, что и в предыдущем примере, но с выдачей результатов в текстовый файл list_exe.txt текущего каталога.

forfiles /P C:\windows\system32 /M *.exe /D +01.09.2014 /C "cmd /c echo @file" - отобразить список файлов программ ( /M *.exe ) из системного каталога Windows (/P C:\windows\system32 ) изменившихся после 01.09.2014 года.

forfiles /P C:\windows\system32 /M *.exe /D -01.09.2014 /C "cmd /c echo @file" - отобразить список файлов программ ( /M *.exe ) из системного каталога Windows (/P C:\windows\system32 ) изменившихся 01.09.2014 года или ранее.

forfiles /P %TEMP% /M *.* /D 0 /C "cmd /c echo @file размер - @fsize" - отобразить имена и размеры всех файлов из каталога временных файлов, изменившихся сегодня.

forfiles /P %TEMP% /M *.log /D -3 /C "cmd /c if @isdir==FALSE notepad.exe @file" - открыть в блокноте файлы с расширением .log из каталога временных файлов, изменившиеся за последние 3 дня.

FORFILES /S /P %USERPROFILE%\Documents\ /M *.doc* /D +01.08.2014 /C "cmd /c echo @path изменен @fdate @ftime" - отобразить список документов в папке "Документы" и ее подкаталогах в профиле текущего пользователя, которые были изменены после 1 августа 2014 года. Отображается полные пути и имена файлов, дата и время их изменения. Пример результата выполнения команды в среде Windows 7:

Выбирает и выполняет команду для файла или набора файлов. Эта команда чаще всего используется в пакетных файлах.

Синтаксис

Параметры

  • Выбирает файлы с датой последнего изменения позже или равным () + или ранее или равной ( - ) указанной даты, где Дата соответствует формату mm/дд/гггг.
  • Выбирает файлы с датой последнего изменения позже или равным ( + ) текущей датой плюс указанное число дней, а также до или менее ( - ) текущей датой минус указанное число дней.
  • Допустимые значения дней включают любое число в диапазоне от 0 до 32768. Если знак не указан, + по умолчанию используется.

Remarks

forfiles /S Команда аналогична dir /S .

В командной строке можно использовать следующие переменные, как указано в параметре командной строки /c :

Команда forfiles позволяет выполнять команду или передавать аргументы в несколько файлов. Например, можно выполнить команду Type для всех файлов в дереве с расширением имени файла .txt. Также можно выполнить каждый пакетный файл (* .bat) на диске C с именем файла Myinput.txt в качестве первого аргумента.

Эта команда может:

Выберите файлы в абсолютную или относительную дату с помощью параметра /d .

Создайте архивное дерево файлов с помощью переменных, таких как @FSIZE и @FDATE .

С помощью переменной можно отличать файлы от каталогов @ISDIR .

Включите специальные символы в командную строку, используя шестнадцатеричный код для символа в формате 0x чч (например, 0x09 для вкладки).

Эта команда работает путем применения recurse subdirectories флага к средствам, предназначенным для обработки только одного файла.

Примеры

Чтобы вывести список всех пакетных файлов на диске C, введите:

Чтобы вывести список всех каталогов на диске C, введите:

Чтобы получить список всех файлов в текущем каталоге, которые устарели по крайней мере один год, введите:

Чтобы отобразить текстовый файл , устаревший для каждого из файлов в текущем каталоге, которые старше 1 января 2007, введите:

Чтобы вывести список расширений имен файлов в текущем каталоге в формате столбца и добавить вкладку перед расширением, введите:

Конфигурация компьютера
Процессор: i5-4670@3400
Материнская плата: ga-z97m-d3h
Прочее: Zalman CNPS10X Performa
Есть специально для того предназначенный инструмент — RoboCopy. »

Спасибо
Сделал так, Все верно или лучше, что то добавить?

robocopy "\\dc\1c_update\1cv8" "C:\Program Files (x86)\1cv8" /MIR /Z

Читаем xcopy /?
/D:m-d-y Копирует файлы, измененные либо в указанный день, либо после. »
лучше уж 1с разместить на терминале и там обновлять »

Это зависит от того, что Вы хотите получить. Если резервную копию — то, разумеется, неверно. Резервная копия — это никогда не зеркало/реплицирование (по той же причине, не являются резервированием перемещаемые профили пользователей в домене, схемы синхронизации через интернет типа Dropbox и присные с ним) . Что будет, если по каким-то причинам с исходными файлами случится что-то нехорошее (удаление, повреждение содержимого и т.п.)?

Если же Ваша цель именно простая репликация, а не резервирование — то в общем случае этого достаточно, разве что с параметрами логирования поиграться: Robocopy и убедиться, что файловая система в источнике и приёмнике — NTFS.

написал строчку копирующую все файлы папками в другую папку.
Вот команда
xcopy "\\dc\1c_update\1cv8" "C:\Program Files (x86)\1cv8" /y /S /E
krasavchik0, В чём трудность дописать в строчке /D ?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

P < путь > Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.)

/M < маска_поиска > Поиск файлов с помощью маски. Маска поиска по умолчанию "*"

/S Рекурсивное выполнение программы forfiles во всех подпапках, аналогично "DIR /S"

/C < команда >
Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки. Команда по умолчанию "cmd /c echo @file". Следующие переменные могут использоваться в строке команды:

@file Возвращает имя файла
@fname Возвращает имя файла без расширения
@ext Возвращает только расширение имени файла
@path Возвращает полный путь к файлу
@relpath Возвращает относительный путь к файлу
@isdir Возвращает значение "TRUE", если типом файла является папка, и "FALSE" для файлов
@fsize Возвращает размер файла в байтах
@fdate Возвращает дату последнего изменения файла
@ftime Возвращает время последнего изменения файла

Для включения специальных символов в строку команды следует использовать шестнадцатеричный код символа в формате 0xHH (например, 0x09 для табуляции, 0x22 - двойная кавычка). Перед внутренними командами CMD.exe необходимо ставить "cmd /c".

/D < дата > Выбор файлов, у которых дата последнего изменения больше или равна (+) либо меньше или равна (-) указанной дате при использовании формата "dd.MM.yyyy"; либо файлов, у которых дата последнего изменения больше или равна (+) текущей дате плюс "dd" дней либо меньше или равна (-) текущей дате минус "dd" дней. Допустимым числом дней "dd" является любое число в диапазоне 0 - 32768. "+" используется по умолчанию, если знак не указан.

/? или -? Вывод справки по использованию

Замечания по использованию FORFILES

На что хотелось бы сразу обратить внимание.
Параметр P - это именно путь к обрабатываемым файлам. И нельзя здесь писать по привычке заодно и маску файлов, например /p с:\tmp\*.tmp. Это неправильно! Для маски файлов существует отдельный параметр - M.
И это еще можно было бы понять, если бы в параметре M можно было бы перечислить несколько масок. Так нет же.
И раз уж речь зашла о масках - переменная @ext содержит расширение выбранного файла и может быть использована для обработки.

Примеры использования FORFILES

В простых случаях использование FORFILES дает мало преимуществ по сравнению с командой dir.

В следующем примере будут выведены все поддиректории, начиная с определенной в параметре P.

FORFILES /p C:\111 /s /c "CMD /C if @ISDIR==TRUE echo @FILE is a folder"

Учитывая некоторую . нестандартность параметров команды FORFILES, на мой взгляд, в простых случаях лучше использовать команду dir. По крайней мере, привычнее.

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

Так же просто решается задача обработки файлов, старше определенного количества дней.

В приведенном выше примере все файлы текущей папки дата создания (изменения) которых больше 30 дней переносятся в архив.

Как вариант - обработка файлов с текущей датой создания (изменения).

Следующая популярная область применения FORFILES - обработка файлов в зависимости от их размера.

FORFILES /P c:\ /S /C "cmd /c if @fsize GTR 10000000 echo @path"
Не бесполезный пример. Позволяет провести аудит диска на предмет наличия "больших" файлов.
И еще один пример - поиск "маленьких" файлов, как вариант - нулевой длины. FORFILES /P "%USERPROFILE%\Local Settings\Temporary Internet Files\Content.IE5" /S /C "cmd /c if @isdir==FALSE if @fsize == 0 del @path /q"

В приведенном выше примере использования FORFILES из папок временных файлов Internet Explorer удаляются файлы нулевой длины.
Если вы пользуетесь этим браузером и редко чистите кэш, то таких ненужных файлов там немало.
На основе предыдущих примеров использования FORFILES без труда можно написать пример очистки и от "старых" файлов, но корректнее это делать соответствующей оснасткой.

В качестве исполняемой команды допустимо использовать внешний bat файл, которому FORFILES может передавать параметры.
Так, в следующем примере для файлов с текущей датой создания (изменения) вызывается bat файл 1.bat, которому в качестве параметра передается имя файла. Т. е. 1.bat будет вызван столько раз, сколько найдется файлов, удовлетворяющих условию.

Несмотря на то, что такое использование может значительно расширять возможности FORFILES, использовать такой прием следует с осторожностью, так как это может значительно увеличить время обработки.

Несколько экзотический пример использование FORFILES. Просто показать возможности этой команды.

FORFILES /M *.txt /C "cmd /c if @fname==0x22qq0x22 echo 0x07"

Мы рассмотрели примеры использования FORFILES.
На мой взгляд, несмотря на некоторую необычность параметров, эта команда стоит того, что бы уделить ей внимание.

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

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

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