Показать полную графическую версию : [решено] Запуск указанных программ в указанное время.
Ну я так понял setlocal создает локальную среду относительно текущего файла? »
В рамках setlocal/endlocal (если endlocal отсутствует — выполняется неявная команда endlocal при завершении текущего контекста пакетного файла).
А в чём ее особености? »
Что изменения в переменных окружения не отразятся за пределами текущего контекста пакетного файла по его завершении.
Одним из следствий является то, что можно их посредством организовать вполне полноценную функцию, возвращающую значение, как в больших ЯВУ.
ritrs@vk
23-05-2015, 23:31
Iska »
а в чём конкретно была ошибка в моем коде? Можно сделать так как я делал? Просто при сдаче, мне прийдется еще объяснять об этой локальной среде.
а в чём конкретно была ошибка в моем коде? »
См. пост #2.
Дело вовсе не в одной, какой-то конкретной ошибке (ошибок по-прежнему куча (http://forum.oszone.net/post-2508746.html#post2508746)). Порочен сам использованный подход.
ritrs@vk
23-05-2015, 23:48
Или тогда проверьте правильно ли я понимаю действия вашей программы:
@echo off //ОТКЛЮЧЕНИЕ ВЫВОДА КОМАНД В СТРОКЕ
setlocal enableextensions enabledelayedexpansion // ОБЪЯВЛЕНИЕ ЛОКАЛЬНОЙ СРЕДЫ
:RepeatEnterTime
set sTime= //ВВОД ВРЕМЕНИ (?)
set /p sTime=Enter time for start programs [hh:mm]: //ВВОД ВРЕМЕНИ (?) ДВА РАЗА ЧТО ЛИ?
if not defined sTime ( //В СЛУЧАИ ЕСЛИ НЕ ВВЕДЕНО НА МЕТКУ ПОВТОРА
echo Need enter time.
goto :RepeatEnterTime
)
echo %sTime%| >nul 2>&1 findstr.exe /i /r /c:"^[0-2][0-9]\:[0-5][0-9]$" || ( //НЕПОНЯЛ
echo Need enter time in format [hh:mm]. //ВЫВОД СООБЩЕНИЯ О ПРАВИЛЬНОМ ВВОДЕ ВРЕМЕНИ
goto :RepeatEnterTime
)
:RepeatEnterPath //ВВОД ПУТИ
set sPath= //ВВОД ПУТИ (2)
set /p sPath=Enter path to program: //ВВОД ПУТИ (2)
if not defined sPath ( //ЕСЛИ НЕ ВВЕДЕНО НА МЕТКУ ПОВТОРА
echo Need enter path.
goto :RepeatEnterPath
)
if not exist "%sPath%" ( //ЕСЛИ ПУТЬ НЕ НАЙДЕН, СООБЩЕНИЕ И НА МЕТКУ ПОВТОРА
echo Can't find file [%sPath%].
echo Need correct path to program.
goto :RepeatEnterPath
)
at.exe %time% /interactive "%sPath%" //ЗАПУСК ПРОГРАММЫ
set sChoice= //ВЫБОР ПОВТОРИТЬ ИЛИ НЕТ
if exist "%SystemRoot%\System32\choice.exe" ( //ВЫВОД ВЫБОРА С ИСП, ПРОГРАММЫ ЧОИС
choice.exe /m "Another program?"
if errorlevel 1 goto :RepeatEnterPath
) else (
set /p sChoice=Another program? [YN]:
if defined sChoice if /i "!sChoice!" equ "y" goto :RepeatEnterPath
)
endlocal
exit /b 0
setlocal enableextensions enabledelayedexpansion // ОБЪЯВЛЕНИЕ ЛОКАЛЬНОЙ СРЕДЫ »
…с одновременным включением расширенной обработки команд и отложенного раскрытия переменных окружения.
set sTime= //ВВОД ВРЕМЕНИ (?) »
Удаление переменной окружения.
set /p sTime=Enter time for start programs [hh:mm]: //ВВОД ВРЕМЕНИ (?) ДВА РАЗА ЧТО ЛИ? »
Ввод — только здесь. Один раз. Предыдущая команда, напротив, удаляла (если она была ранее задана) эту переменную окружения.
if not defined sTime ( //В СЛУЧАИ ЕСЛИ НЕ ВВЕДЕНО НА МЕТКУ ПОВТОРА »
Да. Только чуть иначе — «если переменная не определена», то, значит, ничего не было введено, и потому — переходим к указанной метке.
echo %sTime%| >nul 2>&1 findstr.exe /i /r /c:"^[0-2][0-9]\:[0-5][0-9]$" || ( //НЕПОНЯЛ »
Передаём по конвейеру команде «findstr.exe» вывод команды «echo», а именно — содержимое переменной окружения «sTime», введённое время. Команда «findstr.exe» читает со стандартного ввода переданную строку и проверяет её по указанному шаблону. Если нет соответствия полученной строки указанному шаблону, команда «findstr.exe» устанавливает код козврата отличным от нуля. Соответственно, в этом случае выполняется команда, идущая вслед за «||».
set sPath= //ВВОД ПУТИ (2) »
См. объяснение выше аналогично «set sTime=».
if not defined sPath ( //ЕСЛИ НЕ ВВЕДЕНО НА МЕТКУ ПОВТОРА »
См. объяснение выше аналогично «if not defined sTime …».
at.exe %time% /interactive "%sPath%" //ЗАПУСК ПРОГРАММЫ »
Создание задания.
set sChoice= //ВЫБОР ПОВТОРИТЬ ИЛИ НЕТ »
См. объяснение выше аналогично «set sTime=».
if exist "%SystemRoot%\System32\choice.exe" ( //ВЫВОД ВЫБОРА С ИСП, ПРОГРАММЫ ЧОИС »
Если у Вас есть NT6.x — используем «choice.exe», иначе — «set /p».
ritrs@vk
24-05-2015, 11:39
Есть проблема. Когда я запускаю К.Ф. устанавливаю время и указываю путь к программе время запуска устанавливается то которое сейчас на компьютере. Прилагаю скрин.
http://rghost.ru/6SYtZmh8W/image.png
НАШЕЛ ОШИБКУ:
at.exe %time% /interactive "%sPath%"
Переменная то sTime а не Time.
Хм..пишет в "Статус" что программа работает, но на рабочем столе ее нету, да и в диспетчере задач тоже.
[ИСПРАВЛЕНО] Походу у меня ОС была слишком нагружена. Сейчас перезапустил все отлично работает.
Передаём по конвейеру команде «findstr.exe» вывод команды «echo», а именно — содержимое переменной окружения «sTime», введённое время. Команда «findstr.exe» читает со стандартного ввода переданную строку и проверяет её по указанному шаблону. Если нет соответствия полученной строки указанному шаблону, команда «findstr.exe» устанавливает код козврата отличным от нуля. Соответственно, в этом случае выполняется команда, идущая вслед за «||». »
Можно это заменить на какой нибудь более простой аналог?
ritrs@vk
24-05-2015, 12:35
Передаём по конвейеру команде «findstr.exe» вывод команды «echo», а именно — содержимое переменной окружения «sTime», введённое время. Команда «findstr.exe» читает со стандартного ввода переданную строку и проверяет её по указанному шаблону. Если нет соответствия полученной строки указанному шаблону, команда «findstr.exe» устанавливает код козврата отличным от нуля. Соответственно, в этом случае выполняется команда, идущая вслед за «||». »
Можно это заменить на какой нибудь более простой аналог? »
Я понял. Это проверка на формат времени, так?
ritrs@vk
24-05-2015, 13:26
Все. Я сделал эту программу. Большое спасибо вам, Iska. Много чего узнал полезного, понял как не надо кодить, узнал принцип построения кода(такое ощущение что я пишу здесь Итог для курсовой).
НАШЕЛ ОШИБКУ: »
Угу, есть такое ;). Поправил своё оригинальное сообщение (http://forum.oszone.net/post-2510276.html#post2510276).
Можно это заменить на какой нибудь более простой аналог? »
Не думаю. Язык пакетных файлов очень беден, и «findstr.exe» — фактически, единственный фильтр строк, по шаблонам.
Я понял. Это проверка на формат времени, так? »
Да. Насколько это возможно — что введённая строка соответствует шаблону.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.