Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц / 15 сообщений из 15, страница 1 из 1
06.02.2018, 09:48
    #39597230
AsterixM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
Всем привет.
Столкнулся с такой проблемой, что не могу понять, как вычислить дату... Использовал скрипт указанный ниже

Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
rem @Echo Off
setlocal
1>nul chcp 1251
setlocal enabledelayedexpansion

set log_file=C:\1.log
set dd=%date:~0,2%
set mm=%date:~3,2%
set yyyy=%date:~6,4%

if %dd:~0,1%==0 set dd=%dd:~1%
if %mm:~0,1%==0 set mm=%mm:~1%



set /a feb=yyyy%%4
if %feb%==0 (set feb=29) else (set feb=28)

set /a tok=mm-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 (
rem минус 1 день  set /a dd-=1
   set /a dd-=1
    if !dd!==0 (
        set dd=%%i
        set mm=%tok%
        if !mm!==12 set /a yyyy-=1
    )
)

set dd=0%dd%
set mm=0%mm%

set FinishDate=%dd:~-2%-%mm:~-2%-%yyyy%
echo FinishDateLog=%FinishDate%>>%log_file%

rem ------------- FinishDate показывает правильно -------------------

 rem  set dd1=%dd:~-2%
 rem set mm1=%mm:~-2%
set dd1=%date:~0,2%
set mm1=%date:~3,2%
set yyyy1=%date:~6,4%
 
  if %dd1:~0,1%==0 set dd1=%dd1:~1%
  if %mm1:~0,1%==0 set mm1=%mm1:~1%

 set /a feb1=yyyy1%%4
 if %feb1%==0 (set feb1=29) else (set feb1=28)

set /a tok1=mm1-1
if %tok1%==0 set tok1=12
for /f "tokens=%tok1%" %%k in ("31 %feb1% 31 30 31 30 31 31 30 31 30 31") do (
rem минус 6 день  set /a dd-=6
   set /a dd1-=6
	echo i=%k%>>%log_file%   
    if !dd1!==0 (
        set dd1=%%k
        set mm1=%tok1%
        if !mm1!==12 set /a yyyy1-=1
    )
)

 
 set dd1=0%dd1%
 set mm1=0%mm1%

set StartDate=%dd1:~-2%-%mm1:~-2%-%yyyy1%
echo StartDateLog=%StartDate%>>%log_file%
rem ------ если например пытаемся от 05 числа минус 6 дней, здесь уже показывает неправильно
...
Рейтинг: 0 / 0
06.02.2018, 11:33
    #39597290
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
AsterixM, другой год? 30 февраля? 31 июня?
В батнике муторно писать логику.
Если запутался, нарисуй на бумаге схему всех вариантов, без "оптимизаций".

В помощь
SHIFT
предопределённые переменные среды на каждый yyyy, mm, dd
внешний ехе/питон/пхп/vscript/jscript (в винде) с потоковым входм / выходом (либо читающее/пишущее в переменные среды), т.к. в ЯП легко пишется с библиотечными ф-циями.
...
Рейтинг: 0 / 0
06.02.2018, 12:06
    #39597331
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
Вычисление даты - 6 дней, если попадает на предыдущий месяц
1) Получить текущий день D
2) Получить текущий месяц M и год Y
3) Получить предыдущий месяц: если M=1, то M=12, Y=Y-1, иначе M=M-1
4) Добавить к дню D количество дней в предыдущем месяце N
5) Вычесть 6
6) Сравнить результат с N
7а) Если больше - отнять, и добавить текущий месяц и год
7б) Иначе - добавить предыдущий месяц и год
...
Рейтинг: 0 / 0
06.02.2018, 12:52
    #39597390
AsterixM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
exp98AsterixM, другой год? 30 февраля? 31 июня?
В батнике муторно писать логику.
Если запутался, нарисуй на бумаге схему всех вариантов, без "оптимизаций".


Согласен...муторно, да и времени особо искать выхода нет.

Почему я пришел к этому варианту...
В планировщике Windows, настроена задача, которая вызывает exe c входными параметрами(exe уже есть),
prog.exe ..... /Param1=StartDate /Param2=FinishDate, где
FinishDate - это текущая дата минус 1 день (вчерашний день)
StartDate - это FinishDate минус 6 день

Понимаю, что в самом проекта exe , можно использовать библиотеку для работы с датами (проще, но не нужно)
Нужно просто передавать эти даты и всё...
Я не нашел другого варианта, как использовать bat, а в батнике вызывать start .....\prog.exe /Param1=StartDate /Param2=FinishDate,
соответственно подготовив сначала для этого переменные FinishDate, StartDate

Есть ли другие альтернативы, чтобы можно было бы обойтись без bat, но при этом передавать вычисляемые даты в планировщике?
...
Рейтинг: 0 / 0
06.02.2018, 13:10
    #39597405
exp98
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
AsterixM,
за другие возможности не скажу, мне это редко надо, а у себя точно так же вешаю на задание 3-тьестепенную информационную мелочёвку. файл.cmd вызывает другой файл.cmd и/или файл.vbs и т.п. И что мешает прикрутить вызов нормального скрипта? разве что пароли ...
Например в одном случае шлю еmail из файл.vbs
Для VScript'а/CScript вообще только виндовс и нужен.
В командной строке CScript //nologo "wscheck.vbs" -t=1 <bbb >tt

Или вот выдрал пример своей логики, только для примера и то не для любых веков/1000-й
и только для месяцев
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/// Вычисляет диапазон месяцев между 2-мя датами (1 ... ) в предположении, что from <= to
int TDateReport::MonthsBetweenDates( TDateTime fromD, TDateTime toD)
{
    try
    {   unsigned short y0,m0,d0, y1,m1,d1;
        fromD.DecodeDate(&y0,&m0,&d0);  toD.DecodeDate(&y1,&m1,&d1);
        int dm;

        //dm= (y0 == y1 ? (int)m1 - (int)m0 + 1 :
        //            (12 - (int)m0 +1) + 12*((int)y1 - (int)y0 -1) + m1); // март-март = 1 месяц

        dm= (12 - (int)m0 +1) + 12*((int)y1 - (int)y0 -1) + m1; // март-март = 1 месяц
        return dm;
    }
}//end_sub


для дней в принципе аналогично, c тем усложнением, что вместо 12 будет переменное число 28/29/30/31
...
Рейтинг: 0 / 0
06.02.2018, 13:13
    #39597408
AsterixM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
Нашел интересную ссылку....
кстати, вариант использования VBS в bat https://stackoverflow.com/questions/355425/date-arithmetic-in-cmd-scripting
...
Рейтинг: 0 / 0
06.02.2018, 13:17
    #39597411
AsterixM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
exp98AsterixM,
за другие возможности не скажу, мне это редко надо, а у себя точно так же вешаю на задание 3-тьестепенную информационную мелочёвку. файл.cmd вызывает другой файл.cmd и/или файл.vbs и т.п. И что мешает прикрутить вызов нормального скрипта? разве что пароли ...

Спасибо... Действительно вариант, единственно я так понимаю, скрипты должны рядом с bat валятся, хотя это не проблема
...
Рейтинг: 0 / 0
06.02.2018, 13:25
    #39597418
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
AsterixMЯ не нашел другого варианта, как использовать batПерепиши ВЕСЬ БАТНИК на VBS.
Планировщику пофиг, кого запускать и кому параметры передавать. А на VBS прибавлять-отнимать дни от даты - элементарно...
...
Рейтинг: 0 / 0
06.02.2018, 13:33
    #39597421
AsterixM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
AkinaAsterixMЯ не нашел другого варианта, как использовать batПерепиши ВЕСЬ БАТНИК на VBS.
Планировщику пофиг, кого запускать и кому параметры передавать. А на VBS прибавлять-отнимать дни от даты - элементарно...
Было уже такое, минус в том, что он в потоке создает ещё wbscript.exe, и было замечено, что он не высвобождает себя, поэтому пришлось отказаться от этой идеи. Примечание: в vbs скрипте создавал объект COM и работал с ним...но отказался от этого подхода.

А в найденом примере он также использует vbs, но только для вычисления даты и всё, без использования COM.... Мне этого наверное достаточно будет
...
Рейтинг: 0 / 0
06.02.2018, 13:41
    #39597426
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
AsterixM , у тебя заявленная задача - запустить EXE с параметрами... какие там СОМ и зависший wbscript?
...
Рейтинг: 0 / 0
06.02.2018, 13:51
    #39597439
AsterixM
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
Akina, ну зачем ругаться ? :) Признаюсь! Виноват, что ушел немного от обозначенной мною темы. Сейчас попробую исправить свой bat, и отпишусь о результатах
...
Рейтинг: 0 / 0
06.02.2018, 22:51
    #39597809
д0кХ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
Раз пошла такая пьянка , то угадаю эту мелодию за 3 строки на С

http://www.cplusplus.com/reference/ctime/mktime/
http://www.cplusplus.com/reference/ctime/localtime/

:)
...
Рейтинг: 0 / 0
07.02.2018, 12:06
    #39598075
Lentan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
cmd
@echo off
SETLOCAL ENABLEEXTENSIONS

if "%1"=="" ( start notepad %~f0 & exit /b )
if "%1"=="0" ( start notepad %~f0 & exit /b )

set SP=
if not "%2"=="" (del ~DEFINEDx >nul 2>nul & set SP=%~2)
rem %2: '-' или '/'

set /A PM=%1
if %PM% GTR 0 ( set /A Delta=1 ) else ( set /A Delta=-1 )

set /A YYYY=%DATE:~0,4%
set /A MM=1%DATE:~5,2%-100

rem MM: __010203040506070809101112
set MD28=__312831303130313130313031
set MD29=__312931303130313130313031
rem 0 0 0 0 0 1 1 1 1 1 2 2 2
rem 0 2 4 6 8 0 2 4 6 8 0 2 4

rem ======================================================
set SMDD=
set /A Z = %YYYY% %% 4

if %Z%==0 ( set SMDD=%MD29% ) else ( set SMDD=%MD28% )

set /A P=2*%MM%

set /A MaxDD=0
call :X %%SMDD%:~%P%,2%%

rem ! echo ======================================================
set Q=
set /A N=1
set /A DD=1%DATE:~8,2%-100
:Loop
set /A DD=%DD%+%Delta%
if %DD% GTR %MaxDD% (
call :Y
set /A DD=1
)
if %DD% LSS 1 (
call :Y
)

set /A TD=100+%DD%
set /A TM=100+%MM%

if "%Q%"=="X" echo N=%N% %YYYY%-%TM:~1,2%-%TD:~1,2%

if "%2"=="" echo %YYYY%-%TM:~1,2%-%TD:~1,2%
if "%3"=="" ( echo %YYYY%%SP%%TM:~1,2%%SP%%TD:~1,2%>>~DEFINEDx
) else ( echo %YYYY%%SP%%TM:~1,2%%SP%%TD:~1,2%)

set /A N=%N%+1
set /A PM=%PM%-%Delta%
set Q=
if %PM% NEQ 0 goto :Loop
exit /b

rem ==========================================================
:X
set /A MaxDD=%1
set /A DD=%1
rem set Q=X

exit /b

rem ==========================================================
:Y
set /A MM=%MM%+%Delta%

if %MM% GTR 12 ( set /A YYYY=%YYYY%+%Delta% & set /A MM=1)
if %MM% LSS 1 ( set /A YYYY=%YYYY%+%Delta% & set /A MM=12)

set /A Z=%YYYY% %% 4
if %Z%==0 ( set SMDD=%MD29% ) else ( set SMDD=%MD28% )

set /A P=2*%MM%

call :X %%SMDD%:~%P%,2%%
exit /b
...
Рейтинг: 0 / 0
07.02.2018, 16:11
    #39598313
WebSharper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
На powershell который преинсталлирован начиная с windows 7 / Server 2008 R2

Код: powershell
1.
(date).AddDays(-6)
...
Рейтинг: 0 / 0
18.02.2018, 17:56
    #39603712
Lentan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц
автор@echo off

rem Вычисление дня недели: 0-воскресенье, 1-понедельник, ...
rem days [+|-] day

set /A YYYY=%DATE:~0,4%
set /A MM=%DATE:~5,2%
set /A DD=%DATE:~8,2%

set /A A = (14 - %MM%) / 12
set /A B = %YYYY% - %A%
set /A C = %MM% + (12 * %A%) - 2

set /A days = %1 + %DD% + %B% + (%B% / 4) - (%B% / 100) + (%B% / 400) + ((31 * %C%) / 12)
rem echo days=%days%

set /A week = %days% %% 7
echo week=%week%


ночь, просидел./так давно, довольно, тяжола Формула/, для в понятья с остатки.., и случайно в BIOS, узрел
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / bat. Помогите с решением... Вычисление даты - 6 дней, если попадает на предыдущий месяц / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]