marat-link |
03-04-2010 15:44 1384237 |
40000 дней назад
Доброго времени суток форумчане!
Обращаюсь к Вам в надежде [надежда умирает последней ;)] что Вы поможете решить задачу: 1. Создать каталог с названием dir<дата>, где <дата> - дата, которая была 40000дней тому назад; 2. В каталог dir<дата> скопировать все файлы компьютера созданные с 12 дот 13 часов, и с 14 до 16 часов; 3. Количество файлов и их названия записать в файл report.log. Заранее спасибо!
|
насколько принципиально использование CMD ?.. просто на VBS будет на порядок проще
п.2 и 3 проблемы не составляют, но в п.1 без ф-ций даты весь календарь придется самому считать, как вариант алгоритма: идти от текущей даты "назад" - сначала годами (корректируя поправки на високосные года), а на последнем шаге днями ( пример)
|
amel27, imho VBS препод не оценит ;-)
и почему многие так любят VBs - ведь это тупиковая технология; почему не Js, навыки работы с которым много где могут пригодится.
|
Для определения дыта которая было 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 1400842 |
Вложений: 1
Всем спасибо за попытку решения проблемы. 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 1401007 |
Busla,
Цитата:
и почему многие так любят VBs - ведь это тупиковая технология; почему не Js, навыки работы с которым много где могут пригодится.
|
Эту фразу можно так же адресовать и к BAT, тем не менее он живет, хотя и не развивается.
Отвечу на вопрос, все же. Они (многие) так любят VBS и BAT, потому что эти технологии очень просты в изучении, а текст кода прозрачен и легкочитаем!
|
Вот еще несколько прямолинейный вариант решения.
Код:
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, что даёт дополнительно очень мощные возможности
|
Цитата:
Цитата megaloman
Подавить сообщение Скопировано файлов: 1 мне не удалось »
|
как насчет " >Nul 2>Nul" ?
Цитата:
Цитата megaloman
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%
|
Amel27
Цитата:
числа, начинающиеся на "0" интерпретируются CMD как восьмиричные
|
не подозревал этого.
Самое плохое, что эта ошибка проявлялась бы далеко не каждый раз только для 08 и 09 в исходной дате.
Исправил указанные Вами ошибки. Не знаю, как это корректно с точки зрения поведения на форуме, но исправленный вариант записал вместо старого. Спасибо большое.
|
megaloman, мои совсем старые батники на этом форуме остались с этой ошибкой
|
Время: 17:24.
© OSzone.net 2001-