Последняя модификация Robocopy: точнее дня?

Я работаю над пакетным файлом Windows для выполнения двусторонней синхронизации с сервером. Пакетный файл будет использоваться несколькими людьми для синхронизации нескольких компьютеров с одним сетевым расположением. Из-за ограничений, в которые я не буду вдаваться, это ДОЛЖЕН быть пакетный файл. Нет vbscript, нет javascript, только пакет Windows. Команды Powershell могут быть в порядке, если я могу запускать их из пакетного файла.

Чтобы разрешить удаление файлов, он несколько раз запускает robocopy. Во-первых, он копирует файлы новее, чем в последний раз, когда скрипт запускался с помощью ключа /MAXLAD. Он делает это в обоих направлениях. Затем он делает зеркало с ключом /l и проверяет код выхода, чтобы обнаружить лишние файлы. Если у какой-либо из сторон есть лишние файлы, она запускает зеркало по-настоящему в соответствующем направлении.

Скрипт работает как есть, но...

Проблема в том, что /MAXLAD принимает дату в формате ГГГГММДД, поэтому, если вы создадите файл локально, запустите скрипт синхронизации, затем немедленно удалите файл и снова выполните синхронизацию, он вернется из могилы. Чтобы успешно удалить файл, он должен оставаться неизмененным как минимум за день до последнего запуска скрипта. Я хотел бы каким-то образом снять это ограничение, чтобы его можно было запускать так часто, как захотят мои пользователи, и чтобы оно работало должным образом.

Мой вопрос заключается в следующем: есть ли способ уточнить время последнего доступа? Даже если бы я мог сузить его до часа, это было бы улучшением. Должен ли я делать что-то кроме robocopy для копирования новых файлов?


person user1760508    schedule 19.10.2012    source источник


Ответы (1)


Используя ROBOCOPY AFAIK, невозможно получить точность более точной, чем за один день.
Однако ВОЗМОЖНО добиться большей детализации, используя два других метода.

DIR /o:d /a:-d

Файлы в текущем каталоге будут отсортированы от самого нового к самому старому, а все каталоги будут исключены из списка.
Чтобы перевернуть список так, чтобы он был от самого старого к самому новому, измените /o:d на /o:-d.


Кроме того, оператор FOR может делать то же самое.

@ECHO OFF
setlocal ENABLEDELAYEDEXPANSION
set count=0
:: If some other process left %tmp%\temp.txt, delete it.
if exist %tmp%\temp.txt del %tmp%\temp.txt

for %%x in (*.*) do (
    set /a count=!count!+1
    :: Capture Size
    set size=000000%%~zx
    :: Capture Date and Time
    set td=%%~tx
    :: Turn Date into YYYY/MM/DD format
    set dd=!td:~6,4!/!td:~0,5!
    :: Set tt=hour of day
    set tt=!td:~11,2!
    :: Turn AM/PM time into 24 hour day time
    if !td:~-2!==PM set /a tt=!tt!+12
    :: Add :Minutes to time
    set tt=!tt!:!td:~-5,2!
    :: Append Size Date Time FileName to temp.txt
    call echo !size:~-5! !dd! !tt! %%x>>%tmp%\temp.txt
rem    :: Create variable size[n] and set it to: Size Date Time FileName
rem    call set size[!count!]=!size:~-5! !dd! !tt! %%x
)

echo.
echo Size  Date       Time  FileName
echo ===== ========== ===== ===============

::
:: Alternate 1: Replacing the Append line to `temp.
:: :: Print Array into %tmp%\temp.txt
:: for /l %%x in (1 1 %count%) do (
::  :: Pipe variable into a file
::  echo !size[%%x]!>>%tmp%\temp.txt
:: )

::
:: Alternate 2: Another way to iterate through the array size[n]
:: :loop
::   set /a ctr=%ctr%+1
::   echo !size[%ctr%]!
:: if %ctr% lss %count% goto loop

::
:: Sort temp.txt, starting at the 6th character (the date).
type %tmp%\temp.txt | sort.exe /+6
del %tmp%\temp.txt
echo.

Приведенный выше код не такой длинный и сложный, как кажется. Большая часть — это просто замечания, и почти половина занимает код. Большая часть остального является избыточным кодом, показанным только для отображения

person James K    schedule 21.10.2012