Войти

Показать полную графическую версию : [решено] Батник формирующий дату вчера-сегодня-завтра для применения в командах


Sergey.l
11-01-2018, 13:07
Всем привет. Помогите дописать код даты завтрашнего дня в следующем батнике:
@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 (
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%
set today=%date:~0,2%.%date:~3,2%.%date:~6,4%
set tomorrow= rem код даты завтрашнего дня?

echo Вчера - %yesterday%
echo Сегодня - %today%
echo Завтра - %tomorrow%

md "D:\%y%\%m%\%d%\"
md "D:\%date:~6,4%\%date:~3,2%\%date:~0,2%\"
md "D:\%tomorrow%\" rem код для создания папки с датой завтрашнего дня???

pause

alpap
11-01-2018, 13:50
Sergey.l,
вам в прошлой вашей теме DJ Mogarych привел хороший пример для вчерашней, для завтрашней ничуть не сложнее (PowerShell):

mkdir (get-date).AddDays(1).ToString("dd.MM.yyy")

а если бы вы еще озвучили свою задачу (а если допустимо то и задумку) целиком, то может все по-другому и проще бы сделали.

Sergey.l
11-01-2018, 14:27
Какое расширение у файла должно быть. Можете вместе с коммандами написать, которые указал выше. Мне нужно по маске с датой создавать папки, перемещать файлы (если в имени есть дата), копировать с добавлением даты в имя файла.
Например, создать папки в формате гггг/мм/дд
Переместить файл ддмм_имя.doc
Скопировать файл имя.doc в папку с добавлением даты ддмм_имя.doc
А если не сложно, то помогите ДОПИСАТЬ в батник код завтрашней даты.
В первом сообщении я все указал...
Sergey.l,
вам в прошлой вашей теме DJ Mogarych привел хороший пример для вчерашней, для завтрашней ничуть не сложнее (PowerShell):

mkdir (get-date).AddDays(1).ToString("dd.MM.yyy")

а если бы вы еще озвучили свою задачу (а если допустимо то и задумку) целиком, то может все по-другому и проще бы сделали.

megaloman
11-01-2018, 15:47
Sergey.l, У меня ощущение, что моё решение Вы сочли бесполезным и не вчитывались. (http://forum.oszone.net/thread-332361.html) @Echo Off
cls

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmm"

Set /A DeltaDay=0
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Сегодня

Set /A DeltaDay=-1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Вчера

Set /A DeltaDay=1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Завтра

Set /A DeltaDay=7
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Через неделю

Set /A DeltaDay=-61
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Два месяца тому назад

pause
GoTo :Eof

:StrDate
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
Set "%~1=%@Tdate:~0,4%"
Set "%~2=%@Tdate:~4,2%"
Set "%~3=%@Tdate:~6,2%"
Set "%~4=%@Tdate:~8,4%"
GoTo :Eof

:FromNow

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
rem результат в перемменной %yyyy% %mm% %dd%

SetLocal
Set DT=%2
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal &(Set %~3=%yyyy%&Set %~4=%mm:~-2%&Set %~5=%dd:~-2%)
GoTo :Eof
Оно может показаться длинноватым, но зато отлажено и не надо морщить лоб при написании скрипта с похожим пересчетом.

Sergey.l
11-01-2018, 17:45
Подскажите, а как мне разделить dd mm yyyy для разных команд в одном файле, если эти обозначения одинаковы для вчера, сегодня и завтра.
Sergey.l, У меня ощущение, что моё решение Вы сочли бесполезным и не вчитывались. (http://forum.oszone.net/thread-332361.html) @Echo Off
cls

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmm"

Set /A DeltaDay=0
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Сегодня

Set /A DeltaDay=-1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Вчера

Set /A DeltaDay=1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Завтра

Set /A DeltaDay=7
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Через неделю

Set /A DeltaDay=-61
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyy" "mm" "dd"
Echo %yyyy% %mm% %dd% Два месяца тому назад

pause
GoTo :Eof

:StrDate
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
Set "%~1=%@Tdate:~0,4%"
Set "%~2=%@Tdate:~4,2%"
Set "%~3=%@Tdate:~6,2%"
Set "%~4=%@Tdate:~8,4%"
GoTo :Eof

:FromNow

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
rem результат в перемменной %yyyy% %mm% %dd%

SetLocal
Set DT=%2
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal &(Set %~3=%yyyy%&Set %~4=%mm:~-2%&Set %~5=%dd:~-2%)
GoTo :Eof
Оно может показаться длинноватым, но зато отлажено и не надо морщить лоб при написании скрипта с похожим пересчетом.

megaloman
11-01-2018, 20:50
Sergey.l, как мне разделить dd mm yyyy для разных команд в одном файле, если эти обозначения одинаковы для вчера, сегодня и завтра. »@Echo Off
cls

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmm"

Set /A DeltaDay=0
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyN" "mmN" "ddN"

Set /A DeltaDay=-1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"

Set /A DeltaDay=1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyT" "mmT" "ddT"

Set /A DeltaDay=7
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyW" "mmW" "ddW"

Set /A DeltaDay=-61
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyM" "mmM" "ddM"

Echo %yyyyN% %mmN% %ddN% Сегодня
Echo %yyyyY% %mmY% %ddY% Вчера
Echo %yyyyT% %mmT% %ddT% Завтра
Echo %yyyyW% %mmW% %ddW% Через неделю
Echo %yyyyM% %mmM% %ddM% Два месяца (61 день) тому назад

pause
GoTo :EofДалее по тексту ...

Sergey.l
11-01-2018, 21:36
Я извиняюсь, за свою некомпетентность, но можно вас попросить. Прислать полный код например с такими командами (я не пойму где их указать в вашем коде)

Это будет в батнике УТРО (пример)
md d:\год\месяц\сегодня\
md d:\год\месяц\завтра\
сopy d:\шаблон.doc d:\год\месяц\сегодня\сегоднямесяц_шаблон.doc

Это будет в батнике КОНЕЦ СМЕНЫ (пример)
move d:\год\месяц\вчера\вчерамесяц_шаблон.doc d:\архив\год\месяц\вчера\

Я заметил по предыдущим темам, что вы не понимаете, зачем мне вчера-сегодня-завтра в одном батнике. Они в разных, но в некоторых есть по две даты. К содалению такой принцип работы.
Чтобы вы поняли суть этой неразберихи, объясню принцип своей работы.
Я прихожу на дежурство(смену) и запускаю например батник УТРО, при помощи него создаются рабочие папки, копируются шаблоны с добавлением текущей даты в формате ддмм_шаблон в нужные мне рабочие папки и т.д.
В течении суток я работаю с файлами в папках, некоторые создаю макросами в эксель и ворд. Новые файлы также содержат дату.
В конце смены, т.е. на следующий день, росле того как все распечатаю руководству, а у меня его много, я батником КОНЕЦ СМЕНЫ перемещаю файлы в папки с архивами, т.е. по маске даты "вчерашний день" команды находят файлы и переносят в папки-архив. И затем передаю дежурство другой смене и так 1/2
Папка с затрашним днем нужна для перемещения некоторых файлов для новой заступающей дежурной смены.

1. Могу я использовать в командах формат dd, т.е. переменные dd mm yyyy отдельно или только в формате dd.mm.yyyy, как у вас написано в коде? Т.к. иногда надо найти и переместить файл формата ddmm.doc
2. Куда именно вставлять команды в вашем коде? Пожалуйста, напишите код, если не сложно, с моими примерами команд указанными выше.

Хочется облегчить рабочий процесс, т.к. в день сотни файлов, пачки бумаги и просто физически не успеваешь вручную все перекидывать. Проще указать команды, пути и нажав кнопку все выполнить за секунды.

Sergey.l, как мне разделить dd mm yyyy для разных команд в одном файле, если эти обозначения одинаковы для вчера, сегодня и завтра. »@Echo Off
cls

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmm"

Set /A DeltaDay=0
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyN" "mmN" "ddN"

Set /A DeltaDay=-1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"

Set /A DeltaDay=1
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyT" "mmT" "ddT"

Set /A DeltaDay=7
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyW" "mmW" "ddW"

Set /A DeltaDay=-61
Call :FromNow %DeltaDay% %dd%.%mm%.%yyyy% "yyyyM" "mmM" "ddM"

Echo %yyyyN% %mmN% %ddN% Сегодня
Echo %yyyyY% %mmY% %ddY% Вчера
Echo %yyyyT% %mmT% %ddT% Завтра
Echo %yyyyW% %mmW% %ddW% Через неделю
Echo %yyyyM% %mmM% %ddM% Два месяца (61 день) тому назад

pause
GoTo :EofДалее по тексту ...

megaloman
11-01-2018, 23:03
Sergey.l, @Echo Off
cls

SetLocal EnableDelayedExpansion

CHOICE /C 123 /M "1 - Утро, 2 - Конец смены, 3 - Выйти"

If %ErrorLevel%==3 GoTo :Eof
If %ErrorLevel%==1 Call :Morning
If %ErrorLevel%==2 Call :EndDuty

pause
GoTo :Eof

:Morning
Call :StrDate "yyyy" "mm" "dd" "hhmm"
Call :FromNow 1 %dd%.%mm%.%yyyy% "yyyyT" "mmT" "ddT"

2>nul md "d:\%yyyy%\%mm%\%dd%"
2>nul md "d:\%yyyyT%\%mmT%\%ddT%"
Copy "d:\шаблон.doc" "d:\%yyyy%\%mm%\%dd%\%mm%_шаблон.doc"
GoTo :Eof

:EndDuty
Call :StrDate "yyyy" "mm" "dd" "hhmm"
Call :FromNow -1 %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"

2>nul Md "d:\архив\%yyyyY%\%mmY%\%ddY%"
move /Y "d:\%yyyyY%\%mmY%\%ddY%\%mmY%_шаблон.doc" "d:\архив\%yyyyY%\%mmY%\%ddY%\"
GoTo :Eof

:StrDate
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
Set "%~1=%@Tdate:~0,4%"
Set "%~2=%@Tdate:~4,2%"
Set "%~3=%@Tdate:~6,2%"
Set "%~4=%@Tdate:~8,4%"
GoTo :Eof

:FromNow

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
rem результат в перемменной %yyyy% %mm% %dd%

SetLocal
Set DT=%2
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal &(Set %~3=%yyyy%&Set %~4=%mm:~-2%&Set %~5=%dd:~-2%)
GoTo :Eof
%yyyy% %mm% %dd% Это Год Месяц День сегодня
%yyyyY% %mmY% %ddY% Это Год Месяц День вчера
%yyyyT% %mmT% %ddT% Это Год Месяц День завтра
Вы получили переменные Год Месяц День, используйте их так, как Вам нужно в любой комбинации.

Например, если сегодня 11 января 2018года, то:
%yyyy%-%mm%-%dd% даст значение 2018-01-11
%dd%.%mm%.%yyyy% даст значение 11.01.2018

При вызове подпрограммы Call :StrDate "yyyy" "mm" "dd" "hhmm"
получим сегодняшние %yyyy% %mm% %dd%
Переменные можно обозвать и иначе, лишь бы было соответствие "yyyy" "mm" "dd" --> %yyyy% %mm% %dd%

Call :FromNow 1 %dd%.%mm%.%yyyy% "yyyyT" "mmT" "ddT"

По сегодняшней дате %dd%.%mm%.%yyyy% (то есть 11.01.2018)
Получаем дату "завтра" (1 день вперёд от сегодня) %yyyyT% %mmT% %ddT% (то есть соответственно значения 2018 01 12)

alpap
11-01-2018, 23:16
Sergey.l,
имхо (относительно вашего описанного в #7) дать сменам номера (ники, ...) и именовать ими папки передачи с добавлением даты передачи и не морочить голову ни себе ни людям.

Sergey.l
12-01-2018, 05:57
Адаптировал ваш батник под свои команды. Просто идеально. Огромнейшее спасибо. Век буду помнить!

p.s. для справки. Когда тестировал батник не на рабочем компе, он выдал ошибку(см.вложение). С чем может быть связано? (ДЧ-это имя компьютера)
А на рабочем все идеально, отработал как часы👍
Sergey.l, @Echo Off
cls

SetLocal EnableDelayedExpansion

CHOICE /C 123 /M "1 - Утро, 2 - Конец смены, 3 - Выйти"

If %ErrorLevel%==3 GoTo :Eof
If %ErrorLevel%==1 Call :Morning
If %ErrorLevel%==2 Call :EndDuty

pause
GoTo :Eof

:Morning
Call :StrDate "yyyy" "mm" "dd" "hhmm"
Call :FromNow 1 %dd%.%mm%.%yyyy% "yyyyT" "mmT" "ddT"

2>nul md "d:\%yyyy%\%mm%\%dd%"
2>nul md "d:\%yyyyT%\%mmT%\%ddT%"
Copy "d:\шаблон.doc" "d:\%yyyy%\%mm%\%dd%\%mm%_шаблон.doc"
GoTo :Eof

:EndDuty
Call :StrDate "yyyy" "mm" "dd" "hhmm"
Call :FromNow -1 %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"

2>nul Md "d:\архив\%yyyyY%\%mmY%\%ddY%"
move /Y "d:\%yyyyY%\%mmY%\%ddY%\%mmY%_шаблон.doc" "d:\архив\%yyyyY%\%mmY%\%ddY%\"
GoTo :Eof

:StrDate
FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "@Tdate=%%d"
Set "%~1=%@Tdate:~0,4%"
Set "%~2=%@Tdate:~4,2%"
Set "%~3=%@Tdate:~6,2%"
Set "%~4=%@Tdate:~8,4%"
GoTo :Eof

:FromNow

rem Пересчет даты на заданное кол-во дней
rem Формат даты dd.mm.yyyy +- дни получим новые yyyymmdd

rem Заимствовано http://forum.oszone.net/thread-186889.html
rem вызов Call :FromNow %DeltaDay% %Date% "yyyy" "mm" "dd"
rem результат в перемменной %yyyy% %mm% %dd%

SetLocal
Set DT=%2
Set yyyy=%DT:~-4%& set /a mm=100%DT:~3,2%%%100& set /a dd=100%DT:~,2%%%100
Set /A JD=%~1+dd-32075+1461*(yyyy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yyyy+4900+(mm-14)/12)/100)/4
Set /A L=JD+68569,N=4*L/146097,L=L-(146097*N+3)/4,I=4000*(L+1)/1461001
Set /A L=L-1461*I/4+31,J=80*L/2447,K=L-2447*J/80,L=J/11
Set /A J=J+2-12*L,I=100*(N-49)+I+L
Set /A yyyy=I,mm=100+J,dd=100+K
EndLocal &(Set %~3=%yyyy%&Set %~4=%mm:~-2%&Set %~5=%dd:~-2%)
GoTo :Eof
%yyyy% %mm% %dd% Это Год Месяц День сегодня
%yyyyY% %mmY% %ddY% Это Год Месяц День вчера
%yyyyT% %mmT% %ddT% Это Год Месяц День завтра
Вы получили переменные Год Месяц День, используйте их так, как Вам нужно в любой комбинации.

Например, если сегодня 11 января 2018года, то:
%yyyy%-%mm%-%dd% даст значение 2018-01-11
%dd%.%mm%.%yyyy% даст значение 11.01.2018

При вызове подпрограммы Call :StrDate "yyyy" "mm" "dd" "hhmm"
получим сегодняшние %yyyy% %mm% %dd%
Переменные можно обозвать и иначе, лишь бы было соответствие "yyyy" "mm" "dd" --> %yyyy% %mm% %dd%

Call :FromNow 1 %dd%.%mm%.%yyyy% "yyyyT" "mmT" "ddT"

По сегодняшней дате %dd%.%mm%.%yyyy% (то есть 11.01.2018)
Получаем дату "завтра" (1 день вперёд от сегодня) %yyyyT% %mmT% %ddT% (то есть соответственно значения 2018 01 12)

Petya V4sechkin
12-01-2018, 11:08
Когда тестировал батник не на рабочем компе, он выдал ошибку
Посмотрите, что там выдаст команда:
WMIC OS GET LOCALDATETIME /VALUE
Проверьте, работает ли служба Инструментарий управления Windows (Winmgmt).

DJ Mogarych
12-01-2018, 14:45
Какое расширение у файла должно быть »
.ps1




© OSzone.net 2001-2012