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

Alexander_88 10-07-2018 23:17 2821398

Сделать действия, если интервал времени
 
Здравствуйте, есть код, который ждет определенное количество минут (которые определяет по имени файла), после чего удаляет и копирует файлы (действия выделены жирным).

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

for /f "usebackq tokens=2 delims=- " %%i in (`2^>nul dir /b /a:-d "C:\settings and files\options\sleep - *."`) do set /a iDelay = %%i * 60 - 1

if defined iDelay (
        >nul ping.exe -n %iDelay% 127.0.0.1
        del "C:\settings and files\limit\work limit - *."
        copy "C:\settings and files\options\work limit - *." "C:\settings and files\limit\"

)

endlocal
exit /b 0

Можно ли в данный код добавить еще одно условие, которое будет заключаться вот в чем:
После окончания задержки, действия "копировать - удалить - завершить работу скрипта", должны выполняться только в нужный интервал времени... если текущее время не входит в нужный интервал, то стартует все заново.. т.е. опять включается задержка (которая опять определяется по имени того же файла), ну и после окончания задержки опять проверяет интервал времени...
Также нужный интервал времени должен быть не фиксированным, а также считываться с имени файлов.. файлы будут без расширений.. их будет два, от скольки часов и до скольки часов.
к примеру имена файлов:
"ot - 2"
"do - 8"
это значит, что нужный интервал от 2:00 до 8:00 утра.

Iska 10-07-2018 23:23 2821399

Alexander_88, вот эти игры с параметрами в виде имён файлов мне совсем перестают нравиться. Зачем сие было решено делать именно так, а не как у людей — например, в виде банально-древнего ini-файла или новомодного xml/json-файла?

Alexander_88 11-07-2018 00:13 2821403

Да если б я знал как это сделать.. ведь по простому для себя делаю)
эти файлы я переименую с помощью других батников, батники запускаются через делфи, кнопками.. как бы такая панель управления :)

Iska 11-07-2018 00:54 2821409

Если делаете что-то на Delphi — зачем Вам вообще пакетные файлы? Пишите уж всё на Delphi.

Цитата:

Цитата Alexander_88
Да если б я знал как это сделать.. ведь по простому для себя делаю) »

Например, так:
Скрытый текст

или так:
Скрытый текст

Опиум 11-07-2018 09:42 2821448

Alexander_88,
я для подобных целей 100 лет назад написал утилитку before
http://forum.oszone.net/post-2277704.html

megaloman 11-07-2018 16:29 2821533

Цитата:

Цитата Iska
вот эти игры с параметрами в виде имён файлов мне совсем перестают нравиться »

Alexander_88, Как-то всё извращенно-мудрено
Если всё-таки очень хочется, переделал Ваш код
Код:

@Echo Off

Set "dFrom=C:\settings and files\options"
Set "dTo=C:\settings and files\limit"
Set "fName=work limit - *."

Set "fSleep=sleep - *."
Set "fBeg=ot - *."
Set "fEnd=do - *."

Set /A tBeg=100
Set /A tEnd=124

Set /A iDelay=-1
For /f "usebackq tokens=2 delims=- " %%i in (`2^>nul dir /b /a:-d "%dFrom%\%fSleep%"`) Do Set /A iDelay = %%i * 60

If %iDelay% LSS 0 Exit /b 1
For /f "usebackq tokens=2 delims=- " %%i in (`2^>nul dir /b /a:-d "%dFrom%\%fBeg%"`) Do Set /A tBeg = %%i + 100
For /f "usebackq tokens=2 delims=- " %%i in (`2^>nul dir /b /a:-d "%dFrom%\%fEnd%"`) Do Set /A tEnd = %%i + 100

:Begin
        >nul ping.exe -n %iDelay% 127.0.0.1
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "tNow=%%d"
        Set /A tNow=1%tNow:~8,2%
                rem Echo %tBeg%  %tEnd%  %tNow%  %Time%
        If %tNow% LSS %tBeg% GoTo :Begin
        If %tNow% GEQ %tEnd% Exit /B 0
        2>nul Del "%dTo%\%fName%"
        >nul Copy "%dFrom%\%fName%" "%dTo%\"
Exit /B 0

Если при запуске батника файла с именем задержки нет, ничего не делается, батник завершается
По умолчанию, если нет файлов "ot - *." и "do - *." батник однократно исполнит прописанные действия.
Если текущее время меньше указанного в "ot - *.", батник циклически будет с задержкой опрашивать текущее время до тех пор, пока оно не станет >= в имени файла "ot - *."
Если при запуске батника в файле с именем "do - *." указано время менее текущего, ничего не делается, батник завершается

Alexander_88 11-07-2018 23:26 2821584

Спасибо всем за ответы...

Теперь вот так:

Код:

@Echo Off

Set "dFrom=C:\settings and files\options"
Set "dTo=C:\settings and files\limit"
Set "fName=C:\settings and files\options\work limit - *."

Set "fSleep=C:\settings and files\options\sleep - *."
Set "fBeg=C:\settings and files\options\ot - *."
Set "fEnd=C:\settings and files\options\do - *."

Set /A tBeg=100
Set /A tEnd=124

Set /A iDelay=-1
For /f "usebackq tokens=2 delims=- " %%i in (`2^>nul dir /b /a:-d "%dFrom%\%fSleep%"`) Do Set /A iDelay = %%i * 60

If %iDelay% LSS 0 Exit /b 1
For /f "usebackq tokens=2 delims=- " %%i in (`2^>nul dir /b /a:-d "%dFrom%\%fBeg%"`) Do Set /A tBeg = %%i + 100
For /f "usebackq tokens=2 delims=- " %%i in (`2^>nul dir /b /a:-d "%dFrom%\%fEnd%"`) Do Set /A tEnd = %%i + 100

:Begin
        >nul ping.exe -n %iDelay% 127.0.0.1
        FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO SET "tNow=%%d"
        Set /A tNow=1%tNow:~8,2%
                rem Echo %tBeg%  %tEnd%  %tNow%  %Time%
        If %tNow% LSS %tBeg% GoTo :Begin
        If %tNow% GTR %tEnd% Exit /B 0
        2>nul Del "%dTo%\%fName%"
        >nul Copy "%dFrom%\%fName%" "%dTo%\"
Exit /B 0

есть файлы "sleep - 1" "ot - 0" "do - 3" (получается интервал с 0 до 3 часов.... задержка 1 минута)
время 1:04
батник появляется и исчезает.. даже не выполняет задержку sleep, файлы вроде не копирует, проверил. Продовал также сменить интервал с "ot - 1", "do - 3".. то же самое... может что - то не то делаю?

1 Нужно сначала выполнить задержку sleep, потом пункт 2
2 если текущее время в интервале ot do часов.. то выполнить действия и завершиться.......... если не в текущем интервале, то начать с пункта 1.

Цитата:

Если текущее время меньше указанного в "ot - *.", батник циклически будет с задержкой опрашивать текущее время до тех пор, пока оно не станет >= в имени файла "ot - *."
Если при запуске батника в файле с именем "do - *." указано время менее текущего, ничего не делается, батник завершается
а это не одно и то же?
если от 0 до 3
текущее время например 6... получается текущее время и больше до и меньше от... т.е. под два условия попадает?

у меня по идее на примере время меньше "ot - *", значит батник не должен просто завершаться?

megaloman 12-07-2018 05:36 2821596

Alexander_88, обратите внимание, имена файлов указываются без путей.
Код:

Set "fName=work limit - *."
Set "fSleep=sleep - *."
Set "fBeg=ot - *."
Set "fEnd=do - *."

Пути к папкам указаны выше.
Естественно что батник при Ваших описаниях не находит файл sleep и завершается.
Для отладки можете убрать rem перед echo. При этом полУчите время (часы + 100) из файлов ot, do (если они существуют в указанной папке, иначе будет 0 и 24 (то есть отобразится 100 и 124)), и текущий час (+100). А также время системы.
6 не входит в интервал от 0 до 3, батник завершится.
Для 1.04 батник должен отработать (при правильном описании файлов)

Уточнение: Строку
If %tNow% GTR %tEnd% Exit /B 0
необходимо исправить для более правильного попадания текущего времени в заданный интервал
Код:

If %tNow% GEQ %tEnd% Exit /B 0


Время: 22:42.

Время: 22:42.
© OSzone.net 2001-