информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеСтрашный баг в WindowsПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
 С наступающим 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / sysadmin
Имя Пароль
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Не надо так думать! ;) Есть решение! [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

---
<sysadmin> Поиск 






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach