Компьютерный форум 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=235677)

dvassilyev 31-05-2012 11:08 1925460

текущая дата минус один день.
 
Доброго дня всем.

возникла небольшая загвоздка, нужно получить в переменную дату за минусом одного дня
типо такого echo %date% получим 31.05.2012, а мне нужно минус один день т.е. 30.05.2012 и вставить все это в путь \\server\30.05.2012

Спасибо

megaloman 31-05-2012 16:47 1925616

Решено для произвольного числа дней

dvassilyev 01-06-2012 09:33 1925906

нашел вот такой батник немного переделал, все работало, сегодня получил дату 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%

sov44 01-06-2012 12:27 1925979

Цитата:

Цитата dvassilyev
сегодня получил дату 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 1944223

все ок, робит отлично :)

Спасибо большое

CyberMuesli 02-07-2012 18:01 1944446

Цитата:

Цитата sov44
set /a feb=y%%4 »

високосным является не год, который делится без остатка на 4, а тот, который делится на 4, кроме тех, которые делятся на 100, но не делятся на 400

Iska 02-07-2012 18:28 1944472

CyberMuesli, народ так далеко не заглядывает, а 2000-й удачно пришёлся на указанное исключение.

CyberMuesli 02-07-2012 18:29 1944475

Цитата:

Цитата Iska
народ так далеко не заглядывает »

а почему серым цветом и маленькими буквами?

Iska 02-07-2012 19:22 1944517

Потому что я написал оффтопиком своё мнение.

CyberMuesli 02-07-2012 19:23 1944518

Цитата:

Цитата Iska
Потому что я написал оффтопиком своё мнение »

всё по теме

Foreigner 02-07-2012 20:22 1944558

Цитата:

Цитата CyberMuesli
високосным является не год, который делится без остатка на 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 1944559

Цитата:

Цитата Foreigner
Цитата CyberMuesli:
високосным является не год, который делится без остатка на 4 »
Я что-то не пойму »

http://ru.wikipedia.org/wiki/%C2%E8%...B%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 1944568

CyberMuesli,
Астрономия. Но для бекапов сойдет и x%y

CyberMuesli 03-07-2012 14:22 1944960

Цитата:

Цитата Foreigner
Астрономия. Но для бекапов сойдет и x%y »

Для бэкапов сойдет и вообще без високосного. Пока он наступит - Вы уже уволились и перешли на другую работу.

dvassilyev 19-07-2012 13:22 1954800

CyberMuesli, да и такое бывает

sov44 27-11-2014 08:20 2436188

Нужно создать переменные некоторого диапазона прошедших дней. Столкнулся с проблемой раскрытия в "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


Iska 27-11-2014 09:03 2436196

Цитата:

Цитата sov44
Столкнулся с проблемой раскрытия в "tokens=!tok!" в цикле. »

Там не должно быть «!Var!».

Цитата:

Цитата sov44
Есть идеи? »

Использовать иной подход. Или вынести эту часть в отдельную процедуру. Значение «tok» передавайте в неё параметром.

Foreigner 27-11-2014 09:03 2436197

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 2967797

Нужно было вывести даты с шагом в 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 2967799

vladobro87, В чем новизна? 11 лет тому назад здесь было сделано.
Здесь этот код применён в слегка модифицированном виде - процедура, ИМХО, более удобна в применении и увеличина надёжность.


Время: 20:27.

Время: 20:27.
© OSzone.net 2001-