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

Sergey.l 14-01-2018 17:17 2791311

Выполнение команд в бат в зависимости от времени запуска
 
Доброго времени суток!
Помогите дописать условия выполнения команд в зависимости от времени запуска бат
Например, есть вот такой код
Скрытый текст
Код:

@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"

Echo %ddY%.%mmY%.%yyyyY% - Вчера
Echo %ddN%.%mmN%.%yyyyN% - Сегодня
Echo %ddT%.%mmT%.%yyyyT% - Завтра

==============================================================================================================
rem Выполняется с 08:00:00,00 до 23:59:59,99 (ДЕНЬ)
move /y "D:\Dipost\BOXES\Системный ящик\Удаленные\*.*" "D:\Dipost\BOXES\Системный ящик\%ddN%%mmN%\вход\"
move /y "D:\Dipost\BOXES\Системный ящик\Отправленные\*.*" "D:\Dipost\BOXES\Системный ящик\%ddN%%mmN%\отпр\"
move /y "D:\Dipost\BOXES\Системный ящик\Уведомления\*.*" "D:\Dipost\BOXES\Системный ящик\%ddN%%mmN%\увед\"

rem Выполняется с 00:00:00,00 до 07:59:59,99 (НОЧЬ)
move /y "D:\Dipost\BOXES\Системный ящик\Удаленные\*.*" "D:\Dipost\BOXES\Системный ящик\%ddY%%mmY%\вход\"
move /y "D:\Dipost\BOXES\системный ящик\Отправленные\*.*" "D:\Dipost\BOXES\Системный ящик\%ddY%%mmY%\отпр\"
move /y "D:\Dipost\BOXES\системный ящик\Уведомления\*.*" "D:\Dipost\BOXES\Системный ящик\%ddY%%mmY%\увед\"
==============================================================================================================

: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 вызов 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

pause


Задача состоит в том, чтобы в течении дня с 08:00:00,00 до 23:59:59,99 запускать батник в котором выполнялись команды move c переменными Сегодня "yyyyN" "mmN" "ddN" и перемещали письма в указанные папки с датой дежурства, например D:\Dipost\BOXES\Системный ящик\1401\
После полуночи с 00:00:00,00 до 07:59:59,99 дата меняется и требуется, чтобы в батнике выполнялись команды с переменными Вчера "yyyyY" "mmY" "ddY", перемещая письма в D:\Dipost\BOXES\Системный ящик\1401\

Просьба не советовать как можно это сделать в PowerShell, WSH и т.д. мне нужна помощь в указанном выше BAT

p.s. За батник с датой вчера-сегодня-завтра спасибо пользователю megaloman

alpap 14-01-2018 18:41 2791327

Цитата:

Цитата Sergey.l
запускать ...»

не есть запустить. Через каждую минуту, час, несколько часов?
Вообще проще и правильнее делать это через планировщик, только в одно время с одними параметрами запуска в другое время с другими или разбить на два отдельных bat и запускать каждый в свое время.

Sergey.l 14-01-2018 19:01 2791334

Мне не планировщик нужен. И не автоматизация процесса запуска, а зависимость когда я запускаю батник.
Я буду запускать по мере необходимости накопления писем, в течении рабочих суток.
Понятно, что проще два батника сделать, но задаю здесь вопрос, чтобы узнать есть ли возможность сделать все в одном
Задача состоит в том, чтобы в течении дня с 08:00:00,00 до 23:59:59,99 запускать батник в котором выполнялись команды move c переменными Сегодня "yyyyN" "mmN" "ddN" и перемещали письма в указанные папки с датой дежурства, например D:\Dipost\BOXES\Системный ящик\1401\
После полуночи с 00:00:00,00 до 07:59:59,99 дата меняется и требуется, чтобы в батнике выполнялись команды с переменными Вчера "yyyyY" "mmY" "ddY", перемещая письма в D:\Dipost\BOXES\Системный ящик\1401\
Цитата:

Цитата alpap
Через каждую минуту, час, несколько часов? »


Elven 14-01-2018 19:36 2791344

так и не понял суть задачи, но вроде нужно приблизительно вот это
Код:

set Ntime=%time:~0,2%%time:~3,2%%time:~6,2%
if %Ntime% lss 80000 (
REM код для 00:00:00 - 07:59:59 или переход на соответствующую метку
) else (
REM код для 08:00:00 - 23:59:59 или переход на соответствующую метку
)


megaloman 14-01-2018 21:18 2791380

Сотые доли секунды не рассматриваю - не за чем
Код:

@Echo Off
cls

Set "Time11=080000"
Set "Time12=235959"

Set "Time21=000000"
Set "Time22=075959"

Set "Out=D:\Dipost\BOXES\Системный ящик\1401"

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmmss"
Call :FromNow 0 %dd%.%mm%.%yyyy% "yyyyN" "mmN" "ddN"
Call :FromNow -1 %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"

If 1%Time11% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time12% (
        Echo Move "TraLaLa\%yyyyN%\%mmN%\%ddN%\Маска_файлов" "%Out%\"
)

If 1%Time21% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time22% (
        Echo Move "TraLaLa\%yyyyY%\%mmY%\%ddY%\Маска_файлов" "%Out%\"
)

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,6%"
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

Интервалы нельзя указывать таким образом, чтобы он включал в себя полночь, например с 230000 до 070000

Sergey.l 15-01-2018 00:54 2791427

Не затруднит написать код под любые команды? Скажем, напимер, если время 08:00-23:59 то выполняется 1, если 00:00-07:59 то 2

В таком виде
код
------
1
команды

2
команды
------
Код

Цитата:

Цитата megaloman (Сообщение 2791380)
Сотые доли секунды не рассматриваю - не за чем
Код:

@Echo Off
cls

Set "Time11=080000"
Set "Time12=235959"

Set "Time21=000000"
Set "Time22=075959"

Set "Out=D:\Dipost\BOXES\Системный ящик\1401"

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmmss"
Call :FromNow 0 %dd%.%mm%.%yyyy% "yyyyN" "mmN" "ddN"
Call :FromNow -1 %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"

If 1%Time11% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time12% (
        Echo Move "TraLaLa\%yyyyN%\%mmN%\%ddN%\Маска_файлов" "%Out%\"
)

If 1%Time21% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time22% (
        Echo Move "TraLaLa\%yyyyY%\%mmY%\%ddY%\Маска_файлов" "%Out%\"
)

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,6%"
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

Интервалы нельзя указывать таким образом, чтобы он включал в себя полночь, например с 230000 до 070000


DJ Mogarych 15-01-2018 10:14 2791473

У robocopy есть ключ /mon, который умеет следить за папкой, а также ключ /rh, регулирующий время запуска.
Там вообще много полезных параметров, почитайте:
Код:

robocopy /?

megaloman 15-01-2018 10:54 2791481

Что Вас не пускает написать код под любые команды?
Цитата:

Цитата megaloman
Код:

If 1%Time11% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time12% (
        Echo Move "TraLaLa\%yyyyN%\%mmN%\%ddN%\Маска_файлов" "%Out%\"
)
If 1%Time21% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time22% (
        Echo Move "TraLaLa\%yyyyY%\%mmY%\%ddY%\Маска_файлов" "%Out%\"
)

»

Здесь можно прописать любые команды вместо Echo ........, в том числе и несколько строк.
Вообще-то лучше в таких ситуациях использовать подпрограммы, например:
Код:

@Echo Off
cls

Set "Time11=080000"
Set "Time12=235959"

Set "Time21=000000"
Set "Time22=075959"

Set "Out=D:\Dipost\BOXES\Системный ящик\1401"

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmmss"

If 1%Time11% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time12% Call :Sub1
If 1%Time21% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time22%  Call :Sub2

pause
GoTo :Eof

:Sub1
        Call :FromNow 0 %dd%.%mm%.%yyyy% "yyyyN" "mmN" "ddN"
        Echo Сегодня %dd%.%mm%.%yyyy% Здесь любые команды для сегодня %dd% %mm% %yyyy%
        Echo Например: Move "TraLaLa\%yyyyN%\%mmN%\%ddN%\Маска_файлов" "%Out%\"
GoTo :Eof

:Sub2
        Call :FromNow -1 %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"
        Echo Сегодня %dd%.%mm%.%yyyy% Здесь любые команды для вчера %ddY% %mmY% %yyyyY%
        Echo Например: Move "TraLaLa\%yyyyY%\%mmY%\%ddY%\Маска_файлов" "%Out%\"
GoTo :Eof

И далее по тексту подпрограммы из предыдущего поста
Не сообразил, что 1401 у Вас в пути скорее всего дата. Тогда надо так:
Код:

@Echo Off
cls

Set "Time11=080000"
Set "Time12=235959"

Set "Time21=000000"
Set "Time22=075959"

Set "Out=D:\Dipost\BOXES\Системный ящик"

SetLocal EnableDelayedExpansion

Call :StrDate "yyyy" "mm" "dd" "hhmmss"

If 1%Time11% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time12% Call :Sub1
If 1%Time21% LEQ 1%hhmmss% If 1%hhmmss% LEQ 1%Time22%  Call :Sub2

pause
GoTo :Eof

:Sub1
        Call :FromNow 0 %dd%.%mm%.%yyyy% "yyyyN" "mmN" "ddN"
        Echo Сегодня %dd%.%mm%.%yyyy% Здесь любые команды для сегодня %dd% %mm% %yyyy%
        Echo Например: Move "TraLaLa\%yyyyN%\%mmN%\%ddN%\Маска_файлов" "%Out%\%dd%%mm%\"
GoTo :Eof

:Sub2
        Call :FromNow -1 %dd%.%mm%.%yyyy% "yyyyY" "mmY" "ddY"
        Echo Сегодня %dd%.%mm%.%yyyy% Здесь любые команды для вчера %ddY% %mmY% %yyyyY%
        Echo Например: Move "TraLaLa\%yyyyY%\%mmY%\%ddY%\Маска_файлов" "%Out%\%ddY%%mmY%\"
GoTo :Eof


Старайтесь освоить средства CMD, если уж взялись ваять командные файлы, иначе каждая мелочь будет "в лом". "Код под любые команды" - нет такой команды в CMD :)

Опиум 06-02-2018 00:15 2796108

Цитата:

Цитата Sergey.l
Не затруднит написать код под любые команды? »

я в свое время специально написал утилиту экзешник на похожую тему.
BEFORE.EXE http://forum.oszone.net/post-2277704.html


Время: 20:28.

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