Показать полную графическую версию : [решено] Батник формирующий дату вчера-сегодня-завтра для применения в командах
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
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)
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.