Как скопировать файл в место назначения, только если исходный файл новее, чем любой из файлов назначения?
Я ищу способ выполнить эту задачу. Я попробовал robocopy и написал командный файл, но robocopy, похоже, не в состоянии это сделать (поскольку /MINAGE не может делать время - только даты), и написать командный файл, чтобы сделать все это немного вне меня, так как это становится несколько сложным и превращается в код спагетти.
1) Кто-то загружает файл в исходную папку на сервере (S-диск).
2) Несколько рабочих станций периодически проверяют S-образный привод (каждые 5 минут).
3) Рабочая станция имеет один файл в папке назначения. Если рабочая станция обнаруживает, что на S-диске есть файл, который является более новым, чем файл в папке назначения на рабочей станции, рабочая станция копирует только самый новый файл с S-диска в папку назначения. Имена файлов здесь не имеют значения - имеет значение только метка времени.
С другой стороны, если в папке назначения рабочей станции есть файл с такой же или более новой отметкой времени, чем на S-диске (даже если это другое имя файла), он не должен копировать файл.
4) Рабочая станция запускает отдельный пакетный файл для переименования и обработки нового файла.
2 ответа
Чтобы упростить свой вопрос (насколько я понимаю), вы хотите:
- Посмотрите на исходный каталог и получите последний файл
- Посмотрите на каталог назначения и получите последний файл
- сравнить отметки времени этих двух файлов
- Если исходный файл каталога (шаг 1) новее, чем файл каталога назначения (шаг 2), скопируйте его в каталог назначения.
- Если скопировано, переименуйте новый файл в целевом каталоге.
Шаги 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 для сравнения. (Всемирное координированное время)