Как скопировать файл в место назначения, только если исходный файл новее, чем любой из файлов назначения?

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

1) Кто-то загружает файл в исходную папку на сервере (S-диск).

2) Несколько рабочих станций периодически проверяют S-образный привод (каждые 5 минут).

3) Рабочая станция имеет один файл в папке назначения. Если рабочая станция обнаруживает, что на S-диске есть файл, который является более новым, чем файл в папке назначения на рабочей станции, рабочая станция копирует только самый новый файл с S-диска в папку назначения. Имена файлов здесь не имеют значения - имеет значение только метка времени.

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

4) Рабочая станция запускает отдельный пакетный файл для переименования и обработки нового файла.

2 ответа

Решение

Чтобы упростить свой вопрос (насколько я понимаю), вы хотите:

  1. Посмотрите на исходный каталог и получите последний файл
  2. Посмотрите на каталог назначения и получите последний файл
  3. сравнить отметки времени этих двух файлов
  4. Если исходный файл каталога (шаг 1) новее, чем файл каталога назначения (шаг 2), скопируйте его в каталог назначения.
  5. Если скопировано, переименуйте новый файл в целевом каталоге.

Шаги 1 и 2 можно выполнить с помощью цикла for:

set SOURCE_SERVER = \\ сервер \ источник
set DEST_SERVER=C:\ Папка назначения

set SOURCE_LATEST =
set DEST_LATEST =

REM Последняя отметка времени в исходном каталоге
for /f "tokens=*" %%A in ('dir "%SOURCE_SERVER%\*.*" /b /o:-d') do (если не определено, SOURCE_LATEST устанавливает SOURCE_LATEST = %% ~ fA)

REM последняя отметка времени в каталоге назначения
for /f "tokens=*" %%A in ('dir "%DEST_SERVER%\*.*" /b /o:-d') do (если не определено DEST_LATEST, установите DEST_LATEST=%%~fA)

Подробнее об этом здесь: Как мне написать пакетный скрипт Windows для копирования самого нового файла из каталога?

Шаг 3: Теперь вы знаете последний файл в каждом месте. Время сравнить их метки времени, чтобы увидеть, какой файл новее. Мы можем использовать wmic для получения метки времени для каждого файла, который можно сравнить с реляционными операторами: например, 20150129113038 (что соответствует 29 января 2015 года в 11:30:38) больше, чем 20150129112533 ​​(29 января 2015 года в 11:25:33).

set DEST_FILE_DATE =
set SOURCE_FILE_DATE =

for / f "tokens = 1 skip = 1 delims =." %% A in ('wmic datafile где name^="%SOURCE_LATEST:\=\\%" get "Last Modified"') do (если не определено, SOURCE_FILE_DATE установить SOURCE_FILE_DATE = %% A)

for / f "tokens = 1 skip = 1 delims =." %% A in ('wmic datafile где name^="%DEST_LATEST:\=\\%" get "Last Modified"') do (если не определено, DEST_FILE_DATE установить DEST_FILE_DATE=%%A)

Дополнительные идеи по поводу этого последнего сравнения можно найти здесь: Как сравнить временные метки файлов в пакетном скрипте DOS?

Шаги 4 и 5. Наконец, определите, является ли последний файл файлом на исходном сервере, и при необходимости скопируйте + переименуйте.

если "%SOURCE_FILE_DATE%" гтп "%DEST_FILE_DATE%" (
    REM копирует исходный файл в место назначения и переименовывает его по желанию. скопируйте "%SOURCE_LATEST%" "%DEST_SERVER%\new file name.ext") еще (
    REM Wait 5 минут и попробуйте снова тайм-аут /T 300 перейти: НАЧАТЬ) 

Как насчет следующего командного файла

xcopy "\\ Исходный сервер \ Исходный путь" "c:\ Целевой путь" /C /D /Y

Конечно, "знаки нужны только в том случае, если в именах есть пробелы.

Он использует время UTC для сравнения. (Всемирное координированное время)

Другие вопросы по тегам