Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Тады вот такой батничик для начала: [upd4] 04.10.05 20:33 Число просмотров: 13422
Автор: Den <Denis> Статус: The Elderman Отредактировано 05.10.05 13:29 Количество правок: 9
|
Скриптец позволяет расчитать дату по дельте дней от указанной даты и возвращает результат формата YYYYMMDD в стандартный вывод.
Например, при стандарте РФ в представлении даты системы, для получения даты на 183 дня (примерно полгода) раньше текущей надо делать так (в bat файле):
for /F "tokens=* " %%i in ('calcdate.bat "dd DD.MM.YYYY" "%date%" -183') do set $date=%%i
set year=%$date:~0,4%
set month=%$date:~4,2%
set day=%$date:~-2%
rem Результат
echo YYYY=%year%; MM=%month%; DD=%day%
---
Все параметры для calcdate.bat, кроме дельты, обязательно указывать в двойных кавычках.
С перемещением каталогов додумаю потом (я на работе все-таки), а пока вот вам новая "игрушка":
@echo off
rem ---------- calcdate.bat ----------
rem --- Written by Den[bugtraq.ru] ---
rem ----------------------------------
rem Enter: %1 - Формат передающейся даты в двойных кавычках: DD, MM, YYYY в любой последовательности с любыми разделителями. Пример: "dd DD-MM-YYYY", dd используются для пропускания дней недели.
rem %2 - Дата в двойных кавычках указанного в %1 формата
rem %3 - Дельта со знаком. Примеры: -180, +3
rem Exit: В стандартном выходе расчетная дата формата YYYYMMDD
setlocal
set $date=%~2
call :getpos YYYY "%~1"
if defined $pos (call set year=%%$date:~%$pos%,4%%) else goto :EOF
call :getpos MM "%~1"
if defined $pos (call set month=%%$date:~%$pos%,2%%) else goto :EOF
call :getpos DD "%~1"
if defined $pos (call set day=%%$date:~%$pos%,2%%) else goto :EOF
rem Отбрасываем признак восьмеричного числа.
for /F "tokens=* delims=0" %%i in ("%day%") do set /a daycount=%%i
for /F "tokens=* delims=0" %%i in ("%year%") do set /a year=%%i
for /F "tokens=* delims=0" %%i in ("%month%") do set /a month=%%i
rem Кол-во високосных
set /a i=(%year%-1)/4
rem Текущий после високосного, если j==4, то идет високосный
set /a j=%year%-%i%*4
rem Кол-во дней в полных годах до текущего
set /a daycount+=%i%*1461+(%j%-1)*365
set /a i=%month%
:loop
set /a i-=1
if %i%==0 goto :next
if %i%==1 set /a daycount+=31
if %i%==2 (if %j%==4 (set /a daycount+=29) else set /a daycount+=28)
if %i%==3 set /a daycount+=31
if %i%==4 set /a daycount+=30
if %i%==5 set /a daycount+=31
if %i%==6 set /a daycount+=30
if %i%==7 set /a daycount+=31
if %i%==8 set /a daycount+=31
if %i%==9 set /a daycount+=30
if %i%==10 set /a daycount+=31
if %i%==11 set /a daycount+=30
if %i%==12 set /a daycount+=31
goto :loop
:next
rem Days after christmas: %daycount%
set /a daycount+=%3
rem Result=%daycount%
set /a i=%daycount%/1461
set /a j=%daycount%-%i%*1461
if %j%==0 set /a i-=1
set /a daycount-=%i%*1461
set /a year=%i%*4
set /a i=%daycount%/365
if %j%==0 set /a i-=1
set /a j=%daycount%-%i%*365
if %j%==0 set /a i-=1
set /a daycount-=i*365
set /a i+=1
set /a year+=%i%
set /a j=%daycount%
set /a month=1
:loop_1
if %month%==1 set /a j-=31
if %month%==2 (if %i%==4 (set /a j-=29) else set /a j-=28)
if %month%==3 set /a j-=31
if %month%==4 set /a j-=30
if %month%==5 set /a j-=31
if %month%==6 set /a j-=30
if %month%==7 set /a j-=31
if %month%==8 set /a j-=31
if %month%==9 set /a j-=30
if %month%==10 set /a j-=31
if %month%==11 set /a j-=30
if %month%==12 set /a j-=31
if %j% LEQ 0 goto :next_1
set /a month+=1
set /a daycount=%j%
goto :loop_1
:next_1
set lz=0000
call :getlen "%year%"
set /a $len=4-%$len%
if not %$len%==0 call set year=%%lz:~-%$len%%%%year%
call :getlen "%month%"
set /a $len=2-%$len%
if not %$len%==0 call set month=%%lz:~-%$len%%%%month%
set /a days=%daycount%
call :getlen "%days%"
set /a $len=2-%$len%
if not %$len%==0 call call set days=%%lz:~-%$len%%%%days%
echo %year%%month%%days%
endlocal
goto :EOF
:getlen
rem Enter: %1 - Строка в двойных кавычках
rem Exit: $len - Длина строки без учета двойных кавычек
set par=%~1
set /a i=0
set $len=
:getlen_loop
call :getlen_1 "%%par:~%i%,1%%"
if defined $len goto :EOF
set /a i+=1
goto :getlen_loop
:getlen_1
if %1=="" set /a $len=%i%
goto :EOF
:getpos
rem Enter: %1 - Искомая строка в двойных кавычках
rem %2 - Строка-источник в двойных кавычках
rem Exit: $pos - Позиция искомой строки в строке-источнике без учета двойных кавычек.
call :getlen "%~1"
set /a $findlen=%$len%
call :getlen "%~2"
set /a $formatlen=%$len%-1
set par=%~2
set /a i=0
set $pos=
:getpos_loop
call :getpos_1 %i% "%~1" "%%par:~%i%,%$findlen%%%"
if defined $pos goto :EOF
if %i%==%$formatlen% goto :EOF
set /a i+=1
goto :getpos_loop
:getpos_1
if %2==%3 set /a $pos=%i%
goto :EOF
rem ---------- END calcdate.bat ----------
---
|
|
|