Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Узнать даты понедельника и пятницы текущей недели (http://forum.oszone.net/showthread.php?t=296200)

V!RTuE 28-02-2015 16:45 2477104

Узнать даты понедельника и пятницы текущей недели
 
Задача стоит такая: нужно создать папку с именем дат текущей рабочей недели (пн-пт), например, 2015.02.23-2015.02.27. Вне зависимости от того, когда был запущен батник (в пн или вс).
Получился у меня такой код:
Код:

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion
 
For /F "Tokens=1* Delims==" %%i In ('WMIC Path Win32_LocalTime Get /Value ^| Find "="') Do (
  Set V=%%j
  Set $%%i=!V:~0,-1!
)
If "%$DayOfWeek%"=="0" Set $DayOfWeek=7

set /a DAY=$DayOfWeek-1

call :DateToSecs %date:~-4% %date:~-7,2% %date:~-10,2% secs

set /A adj=DAY*3600*24
set /A dsecs=secs-adj

call :SecsToDate %dsecs% yy mm dd
<nul set /p strTemp=%yy%.%mm%.%dd%->"%~dp0DATE.txt"

set /A dsecs=secs-adj+4*3600*24
call :SecsToDate %dsecs% yy mm dd
<nul set /p strTemp=%yy%.%mm%.%dd%>>"%~dp0DATE.txt"

for /f "UsebackQ" %%A IN ("%~dp0DATE.txt") do (set ThisWeek=%%~A)
echo %ThisWeek%

if not exist "%~dp0%ThisWeek%\" md "%~dp0%ThisWeek%\"
DEL /f /q "%~dp0DATE.txt"

Exit /b 0

:DateToSecs %yy% %mm% %dd% secs
SetLocal EnableExtensions
set yy=%1&set mm=%2&set dd=%3
if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
set /a dd=100%dd%%%100,mm=100%mm%%%100
set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
set /a j=j*86400
endlocal&set %4=%j%&goto :EOF
goto :EOF

:SecsToDate %secs% yy mm dd
SetLocal EnableExtensions
set /a i=%1,ss=i%%60,i/=60,nn=i%%60,i/=60,hh=i%%24,dd=i/24,i/=24
set /a a=i+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
(if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
endlocal&set %4=%dd%&set %3=%mm%&set %2=%yy%&goto :EOF

Подскажите, можно ли как-то оптимизировать его? или использовать другой алгоритм? А то что-то слишком большой код для такой несложной задачи :)

Georgio 28-02-2015 22:31 2477203

Цитата:

Цитата V!RTuE
А то что-то слишком большой код для такой несложной задачи :) »




Да уж, написать такой код "чистыми" средствами языка пакетных файлов у меня не хватило бы духа:).



V!RTuE, попробуйте так:


Код:

@echo off

for /f "tokens=1-6 delims=.-/" %%i in ('
 mshta "vbscript:CreateObject("Scripting.FileSystemObject").GetStandardStream(1).Write(DateAdd("D",1-WeekDay(Date,2),Date)&"."&DateAdd("D",5-WeekDay(Date,2),Date))&Close()"
') do 2>nul md "%~dp0%%k.%%j.%%i-%%n.%%m.%%l"

exit/b 0


.


Время: 04:47.

Время: 04:47.
© OSzone.net 2001-