Показать полную графическую версию : [решено] текущая дата минус один день.
dvassilyev
31-05-2012, 11:08
Доброго дня всем.
возникла небольшая загвоздка, нужно получить в переменную дату за минусом одного дня
типо такого echo %date% получим 31.05.2012, а мне нужно минус один день т.е. 30.05.2012 и вставить все это в путь \\server\30.05.2012
Спасибо
megaloman
31-05-2012, 16:47
Решено для произвольного числа дней (http://forum.oszone.net/thread-186889.html)
dvassilyev
01-06-2012, 09:33
нашел вот такой батник немного переделал, все работало, сегодня получил дату 0.6.2012 :) не много не то :)
for /f "tokens=1,2* delims=." %%I in ('echo %date%') do set /a day=%%I& set /a mon=%%J& set /a year=%%K
set /a day-=1
md c:\%day%.%mon%.%year%
сегодня получил дату 0.6.2012 » :lol:
Попробуйте так:
@echo off
setlocal enabledelayedexpansion
set d=%date:~0,2%
set m=%date:~3,2%
set y=%date:~6,4%
if %d:~0,1%==0 set d=%d:~1%
if %m:~0,1%==0 set m=%m:~1%
set /a feb=y%%4
if %feb%==0 (set feb=29) else (set feb=28)
set /a tok=m-1
if %tok%==0 set tok=12
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
:: минус 1 день set /a d-=1
set /a d-=1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set yesterday=%d:~-2%.%m:~-2%.%y%
echo %yesterday%
pause
dvassilyev
02-07-2012, 11:05
все ок, робит отлично :)
Спасибо большое
CyberMuesli
02-07-2012, 18:01
set /a feb=y%%4 »
високосным является не год, который делится без остатка на 4, а тот, который делится на 4, кроме тех, которые делятся на 100, но не делятся на 400
CyberMuesli, народ так далеко не заглядывает, а 2000-й удачно пришёлся на указанное исключение.
CyberMuesli
02-07-2012, 18:29
народ так далеко не заглядывает »
а почему серым цветом и маленькими буквами?
Потому что я написал оффтопиком своё мнение.
CyberMuesli
02-07-2012, 19:23
Потому что я написал оффтопиком своё мнение »
всё по теме
Foreigner
02-07-2012, 20:22
високосным является не год, который делится без остатка на 4 »
Я что-то не пойму. Например возьмем год 1900. Если тупо отнимать по 4 года с 2012, то 1900 попадает на високосный:
> for /l %i in (2012,-4,1900) do @echo %i
2012
2008
2004
2000
1996
1992
1988
1984
1980
1976
1972
1968
1964
1960
1956
1952
1948
1944
1940
1936
1932
1928
1924
1920
1916
1912
1908
1904
1900
Но если проверить:
> [datetime]::isleapyear("1900")
False
for ( $i=2012; $i -ge 0; $i-- ) {
if ( $($i%4) -eq 0 ) {
if ( !([datetime]::isleapyear($i)) ) { $i }
}
}
Исходя из PowerShell ниже все не високосные, но делятся без остатка на 4
1900
1800
1700
1500
1400
1300
1100
1000
900
700
600
500
300
200
100
Или здесь не математика, а астрономия?
CyberMuesli
02-07-2012, 20:23
Цитата CyberMuesli:
високосным является не год, который делится без остатка на 4 »
Я что-то не пойму »
http://ru.wikipedia.org/wiki/%C2%E8%F1%EE%EA%EE%F1%ED%FB%E9_%E3%EE%E4
set /a Mod4=%%i %% 4
set /a Mod100=%%i %% 100
set /a Mod400=%%i %% 400
set IsLeapYear=No
if !Mod400!==0 (
set IsLeapYear=Yes
) else (
if !Mod4!==0 (
if not !Mod100!==0 (
set IsLeapYear=Yes
)
)
)
Foreigner
02-07-2012, 20:38
CyberMuesli,
Астрономия. Но для бекапов сойдет и x%y
CyberMuesli
03-07-2012, 14:22
Астрономия. Но для бекапов сойдет и x%y »
Для бэкапов сойдет и вообще без високосного. Пока он наступит - Вы уже уволились и перешли на другую работу.
dvassilyev
19-07-2012, 13:22
CyberMuesli, да и такое бывает
Нужно создать переменные некоторого диапазона прошедших дней. Столкнулся с проблемой раскрытия в "tokens=!tok!" в цикле. Есть идеи?
@echo off
setlocal enabledelayedexpansion
for /l %%a in (5,1,9) do (
set d=%date:~0,2%
set m=%date:~3,2%
set y=%date:~6,4%
if "!d:~0,1!"=="0" set d=!d:~1!
if "!m:~0,1!"=="0" set m=!m:~1!
set /a feb=y%%4
if "!feb!"=="0" (set feb=29) else (set feb=28)
set /a tok=m-1
if "!tok!"=="0" set tok=12
for /f "tokens=!tok!" %%i in ("31 !feb! 31 30 31 30 31 31 30 31 30 31") do (
set /a d-=%%a
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0!d!
set m=0!m!
set yesterday=!d:~-2!.!m:~-2!.!y!
echo !yesterday!_%%a
)
pause
Столкнулся с проблемой раскрытия в "tokens=!tok!" в цикле. »
Там не должно быть «!Var!».
Есть идеи? »
Использовать иной подход. Или вынести эту часть в отдельную процедуру. Значение «tok» передавайте в неё параметром.
Foreigner
27-11-2014, 09:03
sov44, Вынести за пределы цикла?
@echo off
setlocal enabledelayedexpansion
for /l %%a in (5,1,9) do (
set d=%date:~0,2%
set m=%date:~3,2%
set y=%date:~6,4%
if "!d:~0,1!"=="0" set d=!d:~1!
if "!m:~0,1!"=="0" set m=!m:~1!
set /a feb=y%%4
if "!feb!"=="0" (set feb=29) else (set feb=28)
set /a tok=m-1
if "!tok!"=="0" set tok=12
call:1 %%a
set d=0!d!
set m=0!m!
set yesterday=!d:~-2!.!m:~-2!.!y!
echo !yesterday!_%%a
)
pause
goto:eof
:1
for /f "tokens=%tok%" %%i in ("31 !feb! 31 30 31 30 31 31 30 31 30 31") do (
set /a d-=%1
if !d!==0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
vladobro87
29-09-2021, 18:14
Нужно было вывести даты с шагом в 7 дней. На самом деле можно вычитать любое количество дней из даты и задавать любое количество шагов:
Так что не только текущая дата минус одна неделя.
@echo off
setlocal enabledelayedexpansion
set date=08.03.2021
set n=7
set m=20
echo.
echo Start: %date%
echo Day: -%n%
echo Step: %m%
echo.
for /l %%i in (1,1,%m%) do (
call :date
)
pause > nul
exit
:date
set d=%date:~0,2%
set m=%date:~3,2%
set y=%date:~6,4%
if %d:~0,1%==0 set d=%d:~1%
if %m:~0,1%==0 set m=%m:~1%
set /a feb=y%%4
if %feb%==0 (set feb=29) else (set feb=28)
set /a tok=m-1
if %tok%==0 set tok=12
for /f "tokens=%tok%" %%i in ("31 %feb% 31 30 31 30 31 31 30 31 30 31") do (
set /a d-=7
if !d! LSS 0 (
set /a d=%%i!d!
set m=%tok%
if !m!==12 set /a y-=1
)
if !d! EQU 0 (
set d=%%i
set m=%tok%
if !m!==12 set /a y-=1
)
)
set d=0%d%
set m=0%m%
set date=%d:~-2%.%m:~-2%.%y%
echo %date%
exit /b
megaloman
29-09-2021, 19:19
vladobro87, В чем новизна? 11 лет тому назад здесь было сделано. (http://forum.oszone.net/post-1507907-2.html)
Здесь этот код применён в слегка модифицированном виде - процедура, ИМХО, более удобна в применении и увеличина надёжность. (http://forum.oszone.net/post-2960032-26.html)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.