Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Не надо так думать! ;) Есть решение! [upd3] 07.10.05 17:19 Число просмотров: 13710
Автор: Den <Denis> Статус: The Elderman Отредактировано 16.07.07 16:43 Количество правок: 5
|
Это у меня дата расчитывается по кол-ву дней, а ведь можно и упростить, сделать расчет по месяцам почти без изменения дня месяца. Получится немного быстрее, но просядет гибкость.
> Можно то оно скорее всего можно, но не следует этого делать > на командных интерпретаторах.
Почему же?
Все равно все это будет делаться ночью, запускаясь из шедулера. Не думаю, что у тебя уровень вложенности каталогов на столько велик, что скрипт не отработает за час.
Мы же не будем даты каталогов конвертить через calcdate.bat.
> Если уж работа с датами > такая, то обходить каталоги, просматривая файлы на предмет > даты их последнего изменения, вообще будет убийство.
Это, как раз менее серьезная и менее времязатратная проблема.
Решение задачи:
(выполняется очень быстро за счет оптимизации парсинга подкаталогов)
@echo off
rem ---------- deltabkp.cmd ----------
rem --- Written by Den[bugtraq.ru] ---
rem ----------------------------------
rem Enter: %1 - Source directory
rem %2 - Date delta
setlocal
if "%~2"=="" (
echo !Error! Date delta not defined.
goto :eof
)
set /a datedelta=%~2
if "%~1"=="" (
echo !Error! File directory not defined.
goto :eof
)
set srcdir=%~f1
if "%srcdir:~-1,1%"=="\" set srcdir=%srcdir:~0,-1%
rem --- Получаем разделитель и формат даты
:loopreg
set regfile=%random%.reg
if exist %regfile% goto :loopreg
regedit /e %regfile% "HKEY_CURRENT_USER\Control Panel\International"
if not exist %regfile% (
echo !Error! REG file not found.
goto :eof
)
for /F "skip=2 tokens=1,* delims== eol=[" %%i in ('type %regfile%') do if "sDate"=="%%~i" (
set datedelim=%%~j
) else if "sShortDate"=="%%~i" set dateform= %%~j
del /Q %regfile%
if not defined datedelim (
echo !Error! Date delimiter not defined.
goto :eof
) else if not defined dateform (
echo !Error! Date format not defined.
goto :eof
)
set dateform=%dateform:d=D%
set dateform=%dateform:m=M%
for /F "delims=yY tokens=1,*" %%k in ("%dateform%") do set dateform=%%kYYYY%%l
set dateform=%dateform:~1%
rem --- Получаем позиции DD,MM,YYYY
for /F "delims=%datedelim% tokens=1,2,3" %%i in ("%dateform%") do (
if "%%i"=="DD" (
if "%%j"=="MM" (set $dateorder=%%z%%y%%%x
) else (set $dateorder=%%y%%z%%%x
)) else if "%%i"=="MM" (
if "%%j"=="DD" (set $dateorder=%%z%%x%%%y
) else (set $dateorder=%%y%%x%%%z
)) else (
if "%%j"=="DD" (set $dateorder=%%x%%z%%%y
) else (set $dateorder=%%x%%y%%%z
))
)
rem --- Получаем дату по дельте от текущей
for /F %%i in ('calcdate.cmd "dd %dateform%" "%date%" %datedelta%') do set $date=%%i
:looptmpfile
set tmpfile=%temp%\dbp%random%.tmp
if exist %tmpfile% goto :looptmpfile
set lvl=0
set baklvl=0
set $dir=
rem "File Not Found" error message from "dir "%~1\*" /a-d/4" command to NUL
call :nextlvl "%srcdir%" 2>nul
if exist %tmpfile% del /Q %tmpfile%
endlocal
goto :eof
:do
rem ----- START BACKUP -----
rem Examples
rem call backup.cmd "%~1"
rem rar m -cfg- -ep2 -idp -m5 -os -ow -s -t -- old_%$date%.rar "%~1"
echo dir=%1
rem ------ END BACKUP ------
goto :eof
:nextlvl
set /a lvl+=1
set /a baklvl+=1
for /F %%d in ('dir /b /ad "%~1\*"') do (
call :nextlvl "%~1\%%d"
)
if %baklvl% LSS %lvl% (
rem --- New files in subdirectories
set /a updlvl=%lvl%-1
set /a lvl-=1
goto :eof
)
set updated=0
dir "%~1\*" /a-d/4 >nul
if errorlevel 0 (
for /F "skip=5 tokens=1 eol= " %%f in ('dir "%~1\*" /a-d/4') do (
for /F "tokens=1,2,3 delims=%datedelim%" %%x in ("%%f") do (
if not "%%y"=="" (
if %$dateorder% GTR %$date% set updated=-1
)))
)
if %updated%==-1 (
rem --- New files found in directory
if %baklvl% GTR %lvl% (
rem --- Old files in subdirectories, back it up!
for /F "tokens=*" %%f in (%tmpfile%) do call :do %%f
del /Q %tmpfile%
)
set /a lvl-=1
goto :eof
) else (
rem --- New Files not found in directory
set baklvl-=1
echo "%~1" >>%tmpfile%
)
:ret
set /a lvl-=1
goto :eof ---
|
|
|