Войти

Показать полную графическую версию : [решено] 40000 дней назад


marat-link
03-04-2010, 15:44
Доброго времени суток форумчане!
Обращаюсь к Вам в надежде [надежда умирает последней ;)] что Вы поможете решить задачу:
1. Создать каталог с названием dir<дата>, где <дата> - дата, которая была 40000дней тому назад;
2. В каталог dir<дата> скопировать все файлы компьютера созданные с 12 дот 13 часов, и с 14 до 16 часов;
3. Количество файлов и их названия записать в файл report.log.

Заранее спасибо!

amel27
05-04-2010, 13:29
насколько принципиально использование CMD ?.. просто на VBS будет на порядок проще

п.2 и 3 проблемы не составляют, но в п.1 без ф-ций даты весь календарь придется самому считать, как вариант алгоритма: идти от текущей даты "назад" - сначала годами (корректируя поправки на високосные года), а на последнем шаге днями (пример (http://forum.oszone.net/showthread.php?p=1344442))

Busla
06-04-2010, 15:18
amel27, imho VBS препод не оценит ;-)

и почему многие так любят VBs - ведь это тупиковая технология; почему не Js, навыки работы с которым много где могут пригодится.

SMprog
17-04-2010, 17:33
Для определения дыта которая было 40000 дней назад используй это: http://www.robvanderwoude.com/files/dateadd_nt.txt

Пример использования:
D:\7496~1\SM-prog\424A~1\BAT'~1>3 -40000

Starting date : 17.04.2010
Days subtracted : 40000
Resulting date : 11.10.1900

marat-link
26-04-2010, 10:34
Всем спасибо за попытку решения проблемы. SMprog - Вам отдельное спасибо. Программу написал, ниже привожу ее код (ars.bat -название bat-файла, определяющего дату -40000; файлы рассматриваю только в каталоге C:\1):

@ECHO OFF
CALL ARS.BAT %DATE% -40000
FOR /F "SKIP=3 TOKENS=4,5* DELIMS=. " %%A IN (ARS.TXT) DO (
SET DD=%%A
SET MM=%%B
SET YYYY=%%C
)
SET YY=%YYYY:~2,2%
SET DIRNAME=DIR%DD%%MM%%YY%
SET DAT=%DD%%MM%%YY%
SET /A IDX = 1
MKDIR %DIRNAME%

DIR C:\1 /A:-D /B >> FIL.TXT
FOR /F %%X IN (FIL.TXT) DO (
CALL :PR1 %%X
)

GOTO:EOF

:PR1
SET A=%1
FOR /F "TOKENS=2,4 DELIMS=: " %%Y IN ('DIR C:\1\%A% /-C ^| FINDSTR /R /B /C:"[0-9]*\.[0-9]*\.[0-9]*"') DO (
CALL :PR2 %A% %%Y)

GOTO:EOF

:PR2
SET T=%2
IF "%T%" GEQ "12" (
IF "%T%" LEQ "13" (
CALL COPY C:\1\%A% %DIRNAME%
SET ARC_FILE=%DAT%%A%
REN %DIRNAME%\%A% %ARC_FILE%
RAR A -DF -SL1258291 ARC.ZIP %DIRNAME%\%ARC_FILE%
RAR VB ARC.ZIP > REPORT.LOG
ECHO %IDX% >> REPORT.LOG
SET /A IDX+=1
)
)

IF "%T%" GEQ "14" (
IF "%T%" LEQ "16" (
CALL COPY C:\1\%A% %DIRNAME%
SET ARC_FILE=%DAT%%A%
REN %DIRNAME%\%A% %ARC_FILE%
RAR A -DF -SL1258291 ARC.ZIP %DIRNAME%\%ARC_FILE%
RAR VB ARC.ZIP>REPORT.LOG
ECHO %IDX% >> REPORT.LOG
SET /A IDX+=1
)
)

GOTO:EOF

vitaliyboch
26-04-2010, 14:21
Busla, и почему многие так любят VBs - ведь это тупиковая технология; почему не Js, навыки работы с которым много где могут пригодится.
Эту фразу можно так же адресовать и к BAT, тем не менее он живет, хотя и не развивается.
Отвечу на вопрос, все же. Они (многие) так любят VBS и BAT, потому что эти технологии очень просты в изучении, а текст кода прозрачен и легкочитаем!

megaloman
28-04-2010, 20:17
Вот еще несколько прямолинейный вариант решения.Echo off
rem CLS

rem -------------------
rem Предполагаю, что Дата в системе выдаётся в формате дд.мм.гггг чч:мм и т д (разделитель не важен)
rem -------------------

Set NDays=40000
Set GdeNewDir=C:\Сказка про белого бычка\
Set Otkuda=D:\Update\
Set KudaLog=C:\Сказка про белого бычка\LogFile.txt

Set TimeTop1=12
Set TimeBot1=13

Set TimeTop2=14
Set TimeBot2=16

rem Выделяю из текущей даты день, месяц, год

Set Dt=%Date%

Set Day=%Dt:~0,2%
If %Day:~0,1%==0 Set Day=%Day:~1,1%

Set Mon=%Dt:~3,2%
If %Mon:~0,1%==0 Set Mon=%Mon:~1,1%

Set Yea=%Dt:~6,4%

rem Вычитаю из тек даты указ кол-во дней

Call :MinusDays

rem Создаю выходную директорию с пересчитанной датой в названии

Set OutDir=%GdeNewDir%Dir%Yea%%Mon%%Day%
MD "%OutDir%"

rem Копирую файлы изменённые в указанных временных промежутках

Echo ----------------- %Date% %Time% --------------- >>"%KudaLog%"
Set AllCopyFiles=0

for /R "%Otkuda%" %%i in (*.*) do Call :copy2time "%%~fi" "%%~ti"

Echo ----------------- Всего скопировано файлов %AllCopyFiles% -------------->>"%KudaLog%"

GoTo End


rem -------------------------------------------------------------
rem Процедура отнимает от даты заданное число дней
rem Дата содержится в трёх переменных Day Mon Yea
rem -------------------------------------------------------------

:MinusDays

Call :DelYear4
For /L %%D IN (1,1,%NDays%) Do Call :OldDt

If %Day% LSS 10 Set Day=0%Day%
If %Mon% LSS 10 Set Mon=0%Mon%

rem Echo %Yea% %Mon% %Day%
rem Pause

GoTo End

rem -------------------------------------------------------------
rem Процедура отнимает от даты периоды в 4 года в отнимаемых днях
rem -------------------------------------------------------------

:DelYear4
REM 1461 - кол-во дней в 4 годах (с високосным)

If %NDays% LSS 1461 GoTo End

Set /A iYea=%NDays%/1461
Set /A Yea=%Yea%-%iYea%*4
Set /A NDays=%NDays%-%iYea%*1461
GoTo End
rem -------------------------------------------------------------


rem ---------------------------------
rem Процедура отнимает от даты 1 день
rem ---------------------------------

:OldDt
Set /A Day=%Day%-1

If %Day% GTR 0 GoTo End

Set Day=31

Set /A Mon=%Mon%-1

If %Mon% GTR 0 GoTo BotDay

Set Mon=12
Set /A Yea=%Yea%-1

:BotDay

If Not %Mon%==2 GoTo Mon30
Set Day=28

Set iYea=%Yea%
Set /A iYea=%iYea%/4
Set /A iYea=%iYea%*4

If %Yea%==%iYea% Set Day=29
GoTo End

:Mon30
If %Mon%==4 Set Day=30
If %Mon%==6 Set Day=30
If %Mon%==9 Set Day=30
If %Mon%==11 Set Day=30

GoTo End
rem ---------------------------------


rem ---------------------------------
rem Процедура копирует файлы изменённые в 2 заданных промежутках времени
rem ---------------------------------

:copy2time

Set TimeFile=%2

Set TimeFile=%TimeFile:~12,2%
If %TimeFile:~0,1%==0 Set TimeFile=%TimeFile:~1,1%

:Time1
If %TimeFile% LSS %TimeTop1% GoTo End
If %TimeFile% GEQ %TimeBot1% GoTo Time2
GoTo CopyFile

:Time2
If %TimeFile% LSS %TimeTop2% GoTo End
If %TimeFile% GEQ %TimeBot2% GoTo End
GoTo CopyFile

:CopyFile
Copy %1 "%OutDir%\" >Nul
Echo %1 %2 >>"%KudaLog%"
Set /A AllCopyFiles=%AllCopyFiles%+1

GoTo End
rem ---------------------------------


:End А насчёт VBS - Вам надо шашечки или ехать? Для автоматизации работы в Windows VBS удобнее JS (я начинал с JS, т к он более модный), так как почти 100% скриптов успешно отрабатывают в Excell, что даёт дополнительно очень мощные возможности

amel27
29-04-2010, 08:39
Подавить сообщение Скопировано файлов: 1 мне не удалось »
как насчет ">Nul 2>Nul" ?

Set Day=%Dt:~0,2%
Set Mon=%Dt:~3,2%
числа, начинающиеся на "0" интерпретируются CMD как восьмиричные:Set /A V=09+1
PAUSE >Nulкак вариант - обрезать ведущие нули перед арифметическими операциями:
If %DATE:~0,1%==0 (Set T_DAY=%DATE:~1,1%) Else Set T_DAY=%DATE:~0,2%
If %DATE:~3,1%==0 (Set T_MONTH=%DATE:~4,1%) Else Set T_MONTH=%DATE:~3,2%

megaloman
29-04-2010, 19:57
Amel27
числа, начинающиеся на "0" интерпретируются CMD как восьмиричные не подозревал этого.
Самое плохое, что эта ошибка проявлялась бы далеко не каждый раз только для 08 и 09 в исходной дате.
Исправил указанные Вами ошибки. Не знаю, как это корректно с точки зрения поведения на форуме, но исправленный вариант записал вместо старого. Спасибо большое.

amel27
30-04-2010, 03:31
megaloman, мои совсем старые батники на этом форуме остались с этой ошибкой




© OSzone.net 2001-2012