2012-10-19 1 views
3

저는 서버와의 양방향 동기화를 수행하기 위해 Windows 배치 파일 작업을하고 있습니다. 배치 파일은 여러 사람이 여러 컴퓨터를 단일 네트워크 위치와 동기화하는 데 사용됩니다. 내가 들어 가지 않을 제한으로 인해 배치 파일이 있어야합니다. 아니 vbscript, 아니 자바 스크립트, 윈도우 배치. Powershell 명령은 배치 파일 내부에서 실행할 수있는 한 괜찮습니다.Robocopy가 마지막으로 수정 됨 : 하루보다 정확합니까?

파일 삭제를 허용하기 위해 robocopy를 여러 번 실행합니다. 먼저/MAXLAD 스위치를 사용하여 스크립트가 실행 된 마지막 시간보다 새로운 파일을 복사합니다. 이것을 양방향으로 수행합니다. 그런 다음/l 스위치를 사용하여 미러를 수행하고 추가 파일을 검색하기 위해 종료 코드를 확인합니다. 어느 쪽이든 여분의 파일이있는 경우 미러를 적절한 방향으로 실재로 실행합니다.

로컬 파일을 만들 경우, 동기화 스크립트를 실행할 수 있도록있는 그대로,하지만 문제는 ...

은/MAXLAD이 양식 YYYYMMDD의 날짜를 받아 스크립트는 잘 작동 즉시 삭제 파일을 다시 동기화하면 무덤에서 다시 나타납니다. 파일을 성공적으로 삭제하려면 스크립트를 마지막으로 실행하기 전에 적어도 하루 동안 수정하지 않아야합니다. 이 제한을 제거하는 방법을 원합니다. 따라서 사용자가 원하는만큼 자주 실행하고 실행할 수 있습니다.

내 질문은 다음과 같습니다. 마지막 액세스 시간이 더 정확하게 표시 될 수있는 방법이 있습니까? 시간으로 좁힐 수 있다고해도, 개선 될 것입니다. 새 파일을 복사하려면 robocopy가 아닌 다른 작업을 수행해야합니까?

답변

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. 

위의 코드는 그리 길지도 복잡하지도 않습니다. 그것의 대부분은 단순히 발언이며, 거의 절반이 코드를 사용합니다. 나머지 대부분은 여분의 코드이며 표시하기 위해 표시됩니다.