2012-06-17 2 views
2

Я хотел бы обратиться за помощью к моей попытке создать скрипт, который будет автоматически проверять последний измененный файл и передавать его в пункт назначения.Использование пакетного скрипта для автоматической копирования последнего файла в папку

Что у меня есть это:

@Echo Off 
Set _Delay=1 
for /f "tokens=1,2,3 delims==" %%a in (config.ini) do (
if %%a==source set _Monitor=%%b 
if %%a==destination set _Dest=%%b 
if %%a==timer set _Timer=%%b 
) 
Set _Base=%temp%\BaselineState.dir 
Set _Chck=%temp%\ChkState.dir 
Set _OS=6 
Ver|Findstr /I /C:"Version 5">Nul 
If %Errorlevel%==0 Set _OS=5 & Set /A _Delay=_Delay*1000 
Goto :_Xfer 
:_StartMon 
@echo off 
SET R1=Start /w Sync1.vbs 
Call :_SetBaseline "%_Base%" "%_Monitor%" 
:_MonLoop 
If %_OS%==5 (Ping 1.0.0.0 -n 1 -w %_Delay%>Nul) Else Timeout %_Delay%>Nul 
Call :_SetBaseline "%_Chck%" "%_Monitor%" 
FC /A /L "%_Base%" "%_Chck%">Nul 
If %ErrorLevel%==0 Goto _MonLoop 
:: 
for /l %%a in (%_Timer%,-1,0) do (
@Echo:::::::::::::::::::::::::::::::::::::::::::::: 
@Echo:: SEC Auto Transfer :: 
@Echo:: Aizal 16 June 2012 :: 
@Echo:::::::::::::::::::::::::::::::::::::::::::::: 
@Echo This script will scan SEC Data Folder for 
@Echo new files every 30 minutes and will copy 
@Echo it to the Server. Make sure you set correct 
@Echo folder before using this script. 
ECHO. 
ECHO Currently recording: 
FOR /F %%a in ('xcopy "%_Monitor%\*.SEC" "%_Dest%" /L /Y') DO (
IF NOT EXIST "%_Dest%.\%%~nxa" ECHO %%~nxa 
) 
ECHO Refreshing... 
ECHO Please wait %%a seconds... 
%R1% 
cls 
) 
:: 
:_Xfer 
FOR /F %%a in ('xcopy "%_Monitor%\*.SEC" "%_Dest%" /L /Y') DO (
IF NOT EXIST "%_Dest%.\%%~nxa" xcopy "%%a" "%_Dest%" /Y 
) 
:: 
Echo.Change Detected 
ECHO. 
Goto :_StartMon 
::::::::::::::::::::::::::::::::::::::::::::::::::: 
:: Subroutine 
::::::::::::::::::::::::::::::::::::::::::::::::::: 
:_SetBaseline 
If Exist "%temp%\tempfmstate.dir" Del "%temp%\tempfmstate.dir" 
For /F "Tokens=* Delims=" %%I In ('Dir /S "%~2"') Do (
Set _Last=%%I 
>>"%temp%\tempfmstate.dir" Echo.%%I 
) 
>"%~1" Findstr /V /C:"%_Last%" "%temp%\tempfmstate.dir" 
Goto :EOF 

Теперь, если вы заметили, что сценарий будет сравнивать содержимое исходной папки с содержимым папки назначения и будет копировать файлы из источника, если нет уже файл в пункте назначения. Я хотел бы знать, может ли кто-нибудь помочь мне выяснить, как заставить скрипт проверять последний измененный файл в исходной папке и ТОЛЬКО копировать его в пункт назначения И, если указанный файл в настоящее время используется/записывается, тогда скрипт будет ждать пока он не закончится, прежде чем пытаться скопировать его снова.

Кроме того, прямо сейчас мне нужно отредактировать файл source.ini, чтобы указать, какую папку я хочу контролировать, и каждый раз, когда мне нужно изменить путь к папке, чтобы следить за изменениями, есть ли способ посмотреть родительскую папку для любого нового файлы и взять этот файл в пункт назначения?

Я нашел этот скрипт в сети, но надеялся проверить файл не на день, а вместо времени.

::Copy Files Made Or Modified Today 
@echo off 
setlocal 
set source= <source directory> 
set dest= <destination directory> 
pushd "%source%" 
set t=%date:~4% 
::for /f %%a in ('dir /b /a-d /o-d') do call :PROCESS "%%a" 
goto :eof 
popd 
:PROCESS 
for /f %%j in ('echo %~t1') do set d=%%j 
if "%d%"=="%t%" copy %1 "%dest%" 
goto :eof 

Надежды найти решение отсюда.

Большое спасибо

+1

Учитывается robocopy? он поддерживает мониторинг, зеркалирование и повторы из командной строки –

+0

Я знаю, что xcopy устарел, но я уверен, что это все еще можно сделать? нет? – Astronyu

+0

Вы можете скачать версию xp из комплекта ресурсов xp –

ответ

2

С этим вы получите последний измененный файл:

for /f %%A in ('dir /b /tw /o-d not-mandatory-file-mask') do (
    set last_file=%%A 
    goto :endloop 
) 
:endloop 

С этим вы будете копировать файл, если это возможно. Если нет, он будет повторять попытку:

:tryagain 
set /a errorlevel=0 
copy some_dir\%last_file% %destination% 
if %errorlevel% NEQ 0 (
    sleep 10 
    goto :tryagain 
) else (
    goto :end 
) 
:end 
Смежные вопросы