Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Windows Новый топик    Ответить
 как получит вчерашнее число в бат файле  [new]
erny
Member

Откуда:
Сообщений: 710
как получит вчерашнее число в бат файле
%date% выводит сегодняшнее
25 июн 07, 21:46    [4312865]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
sanek842
Member

Откуда: Тюмень
Сообщений: 1433
есть 2 варианта

1. Исп. JScript или VB сценарий ( см. что такое Windows Scripting Host )

файл yesterday.js
var today = new Date(); 
var yesterdayDate = new Date(); 
yesterdayDate.setDate( today.getDate() -1 );
WScript.echo("Today       : " + today.toString() + 
 "\nYesterday : " + yesterdayDate.toString());

однако тогда имеет смысл все на wsh и писать, но зато это вариант обойтись штатными виндовыми средствами

2. Использовать порт unix-овых утилит, можно взять здесь UnxUtils.zip
тогда батник можно оформить следующим образом
echo off
for /f %%i in ('C:\UnxUtils\usr\local\wbin\date.exe -d "1 day ago" +%%Y.%%m.%%d') do set YESTERDAY=%%i
echo Yesterday is %YESTERDAY%
26 июн 07, 08:18    [4313415]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
imkot
Member

Откуда: г. Барнаул, Алтайский край
Сообщений: 516
Если нужно именно в bat-файле, то можно разложить дату на составные части и отнять один день, потом делать цепь проверок.
26 июн 07, 11:03    [4314205]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
imkot
Member

Откуда: г. Барнаул, Алтайский край
Сообщений: 516
Вот накропал.
rem echo off
setlocal enabledelayedexpansion

rem set dt=01.02.2008
rem Работает при условии, что %date% распарсится в виде dd.mm.yyyy
rem Если распарсивается в другом виде, то надо поиграть с разбивкой даты на день, месяц, год
rem Разбивку вообще то можно сделать через for и указать разделитель, тогда можно 
rem наплевать на количество цифр в дне/месяце
set dt=%date%
set /A d=%dt:~,2%-1
if !d!==0 (
rem Если надо получить последний день предыдущего месяца
  set /A m=%dt:~3,2%-1
  set y=%dt:~6%
  call :setlastm
) else (
rem Если мы в том же месяце остались после вычитания дня
  set m=%dt:~3,2%
  set y=%dt:~6%
)

rem Дописать ноль слева от числа 
set /A x=d/10
if !x!==0 set d=0!d!

rem Дописать ноль слева от месяца
set /A x=m/10
if !x!==0 set m=0!m!

rem Выводим на экран полученную дату
echo %d%.%m%.%y%
rem Выход из скрипта
exit

rem Это типа процедура у нас тут
rem Если надо открутить месяц
:setlastm
if !m!==0 (
rem Если надо открутить год
  set m=12
  set /A y=y-1
) 
rem теперь надо получить последний день месяца
if !m!==1 set d=31
if !m!==2 call :setfeb
if !m!==3 set d=31
if !m!==4 set d=30
if !m!==5 set d=31
if !m!==6 set d=30
if !m!==7 set d=31
if !m!==8 set d=31
if !m!==9 set d=30
if !m!==10 set d=31
if !m!==11 set d=30
if !m!==12 set d=31
rem Выход из "процедуры"
exit /b

rem Это типа еще одна процедура 
rem С февралем траблы
:setfeb
rem найдем остаток от деления года на 4, чтобы определить високосность года
rem Не рассматриваем случай с високосностью, которая попадает на смену столетия (лениво)
set /A vy=y %% 4
if !vy!==0 (
  set d=29
) else (
  set d=28
)
rem Выход из "процедуры"
exit /b

А вообще это изврат :)
26 июн 07, 11:59    [4314620]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
imkot
Member

Откуда: г. Барнаул, Алтайский край
Сообщений: 516
Ошибочка
вместо
if !d!==0 (
rem Если надо получить последний день предыдущего месяца
  set /A m=%dt:~3,2%-1
  set y=%dt:~6%
  call :setlastm
) else (
rem Если мы в том же месяце остались после вычитания дня
  set m=%dt:~3,2%
  set y=%dt:~6%
)
надо
rem Если надо получить последний день предыдущего месяца
  set /A m=%dt:~3,2%-1
  set y=%dt:~6%
  call :setlastm
) else (
rem Если мы в том же месяце остались после вычитания дня
  set /A m=%dt:~3,2%-0
  set y=%dt:~6%
)
26 июн 07, 12:06    [4314681]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
imkot
Member

Откуда: г. Барнаул, Алтайский край
Сообщений: 516
блин, строчку потерял...
так вот там надо
if !d!==0 (
rem Если надо получить последний день предыдущего месяца
  set /A m=%dt:~3,2%-1
  set y=%dt:~6%
  call :setlastm
) else (
rem Если мы в том же месяце остались после вычитания дня
  set /A m=%dt:~3,2%-0
  set y=%dt:~6%
)
26 июн 07, 12:07    [4314687]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
erny
Member

Откуда:
Сообщений: 710
Спасибо большое за помощь
26 июн 07, 14:24    [4315557]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
erny
Member

Откуда:
Сообщений: 710
to imkot
подскажите есть какоето описание синтаксиса который Вы используете, а то я немогу ничего найти в интернете, а нужно еще парочку скриптов написать
если у Вас есть скиньте пожалуста на 777fox@mail.ru
26 июн 07, 21:26    [4317812]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
golsa
Member

Откуда: Красноярск
Сообщений: 789
В командной строке наберите
help set
help if
help for
и получите полное описание на экране, а
help if > if.txt

позволит сохранить описание в текстовом файле.
Верно по крайней мере для Win2k и WinXP.
27 июн 07, 07:06    [4318422]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
imkot
Member

Откуда: г. Барнаул, Алтайский край
Сообщений: 516
erny
to imkot
подскажите есть какоето описание синтаксиса который Вы используете, а то я немогу ничего найти в интернете, а нужно еще парочку скриптов написать
если у Вас есть скиньте пожалуста на 777fox@mail.ru

Советую почитать вот эту статью. В ней ничего такого, но очень помогает разобраться с командным интерпретатором win2000/Xp
27 июн 07, 07:14    [4318431]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: как получит вчерашнее число в бат файле  [new]
okaraulov
Member

Откуда:
Сообщений: 1
коряво но просто:

tzutil /s "Dateline Standard Time"
for /f "tokens=1-3 delims=./-" %%f in ("%date%") do set dt=%%h.%%g.%%f
tzutil /s "Russian Standard Time"
echo %dt%

в верхнем tzutil ставишь временную зону которая гарантирована будет вчерашней относительно времени запуска батника, а в нижнем возвращаешь к своей.
16 окт 15, 03:15    [18285552]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: как получит вчерашнее число в бат файле  [new]
ReaMas
Member

Откуда:
Сообщений: 3
А я сделал такой вариант, мне он больше нравится:


set Day=%date:~7,2%
set Month=%date:~4,2%
set Year=%date:~10,4%
set /A OldYear=%Year%-1
set /A IntercalaryYear=%Year%/4*4

if %Day%==01 (

if %Month%==01 (
set PreviousDate=%OldYear%1231
goto Found
)

if %Month%==02 (
set PreviousDate=%Year%0131
goto Found
)

if %Month%==03 (
if %Year%==%IntercalaryYear% (
set PreviousDate=%Year%0229
goto Found
)
set PreviousDate=%Year%0228
goto Found
)

if %Month%==04 (
set PreviousDate=%Year%0331
goto Found
)

if %Month%==05 (
set PreviousDate=%Year%0430
goto Found
)

if %Month%==06 (
set PreviousDate=%Year%0531
goto Found
)

if %Month%==07 (
set PreviousDate=%Year%0630
goto Found
)

if %Month%==08 (
set PreviousDate=%Year%0731
goto Found
)

if %Month%==09 (
set PreviousDate=%Year%0831
goto Found
)

if %Month%==10 (
set PreviousDate=%Year%0930
goto Found
)

if %Month%==11 (
set PreviousDate=%Year%1031
goto Found
)

if %Month%==12 (
set PreviousDate=%Year%1130
goto Found
)

)

set /A Yesterday=%Day%-1
set /A OneDigit=Yesterday/10
if %OneDigit%==0 set Yesterday=0%Yesterday%
set PreviousDate=%Year%%Month%%Yesterday%

:Found
echo %PreviousDate%
2 июл 17, 21:01    [20607418]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
ReaMas
Member

Откуда:
Сообщений: 3
В качестве исходных данных взята дата в западном формате: "день недели", "месяц", "число", "год".
3 июл 17, 00:34    [20607721]     Ответить | Цитировать Сообщить модератору
 Re: как получит вчерашнее число в бат файле  [new]
ReaMas
Member

Откуда:
Сообщений: 3
Надо в указанном мной коде поменять:

set /A Yesterday=%Day%-1
set /A OneDigit=Yesterday/10
if %OneDigit%==0 set Yesterday=0%Yesterday%
set PreviousDate=%Year%%Month%%Yesterday%

на это:

set /A CalculatePreviousDay=1%Day%-1
set Yesterday=%CalculatePreviousDay:~1,2%
set PreviousDate=%Year%%Month%%Yesterday%

иначе будут проблемы на числах 08 и 09, так как команда SET считает число, начинающееся на ноль, числом в восьмеричной системе счисления.
8 июл 17, 20:22    [20626157]     Ответить | Цитировать Сообщить модератору
Все форумы / Windows Ответить