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

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

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

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

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

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

2 ответа2

1

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

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

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

set SOURCE_SERVER=\\server\source
set DEST_SERVER=C:\Destination Folder

set SOURCE_LATEST=
set DEST_LATEST=

REM Latest timestamp in the source directory
for /f "tokens=*" %%A in ('dir "%SOURCE_SERVER%\*.*" /b /o:-d') do (
    if not defined SOURCE_LATEST set SOURCE_LATEST=%%~fA)

REM latest timestamp in the destination directory
for /f "tokens=*" %%A in ('dir "%DEST_SERVER%\*.*" /b /o:-d') do (
    if not defined DEST_LATEST set 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 where name^="%SOURCE_LATEST:\=\\%" get "Last Modified"') do (
    if not defined SOURCE_FILE_DATE set SOURCE_FILE_DATE=%%A)

for /f "tokens=1 skip=1 delims=." %%A in ('wmic datafile where name^="%DEST_LATEST:\=\\%" get "Last Modified"') do (
    if not defined DEST_FILE_DATE set DEST_FILE_DATE=%%A)

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

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

if "%SOURCE_FILE_DATE%" gtr "%DEST_FILE_DATE%" (
    REM copy the source file to the destination and rename it as desired.
    copy "%SOURCE_LATEST%" "%DEST_SERVER%\new file name.ext"
) else (
    REM Wait 5 minutes and try again
    timeout /T 300
    goto :START
)
0

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

xcopy "\\ Исходный сервер \ Путь к источнику" "c:\ Путь к месту назначения" /C /D /Y

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .