Войти

Показать полную графическую версию : [решено] Запуск указанных программ в указанное время.


Страниц : 1 [2]

Iska
23-05-2015, 02:18
Ну я так понял setlocal создает локальную среду относительно текущего файла? »
В рамках setlocal/endlocal (если endlocal отсутствует — выполняется неявная команда endlocal при завершении текущего контекста пакетного файла).

А в чём ее особености? »
Что изменения в переменных окружения не отразятся за пределами текущего контекста пакетного файла по его завершении.

Одним из следствий является то, что можно их посредством организовать вполне полноценную функцию, возвращающую значение, как в больших ЯВУ.

ritrs@vk
23-05-2015, 23:31
Iska »
а в чём конкретно была ошибка в моем коде? Можно сделать так как я делал? Просто при сдаче, мне прийдется еще объяснять об этой локальной среде.

Iska
23-05-2015, 23:37
а в чём конкретно была ошибка в моем коде? »
См. пост #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

Iska
24-05-2015, 00:14
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. Много чего узнал полезного, понял как не надо кодить, узнал принцип построения кода(такое ощущение что я пишу здесь Итог для курсовой).

Iska
24-05-2015, 16:06
НАШЕЛ ОШИБКУ: »
Угу, есть такое ;). Поправил своё оригинальное сообщение (http://forum.oszone.net/post-2510276.html#post2510276).

Можно это заменить на какой нибудь более простой аналог? »
Не думаю. Язык пакетных файлов очень беден, и «findstr.exe» — фактически, единственный фильтр строк, по шаблонам.

Я понял. Это проверка на формат времени, так? »
Да. Насколько это возможно — что введённая строка соответствует шаблону.




© OSzone.net 2001-2012