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

ritrs@vk 16-05-2015 23:10 2508150

Запуск указанных программ в указанное время.
 
Приветствую форумчане. Есть задание(в теме указано что именно). Командый файл добавляет указанную программу в назначенные задачи и она должна выполнятся, но в "Статус" - на момент наступления запуска пишит что "Запуск не удался". В чём может быть проблема?
Код:

@set /P k1="Vvedite vremya zapuska program:  "
:F
@set /P k2="Vvdeite putb k programmam:  "
@echo %k2% >> myfile.txt
@set /P ar="Eshche odny programy? Y-da, N-net:  "
@if %ar%==Y goto F
@If %ar%==N goto next
:next
if not exist %k2% goto :bad && else
@echo off
for /f "tokens=*" %%i in (myfile.txt) do (at "%k1%" start "%k2%")
echo "Deystvie vipolneno yspeshno"
del myfile.txt
pause>nul
:bad
@echo "Programma ne naidena, popro6yem ewe?"
@goto F
@del myfile.txt


Iska 17-05-2015 00:06 2508170

Потому что кошмар вместо кода.

ritrs@vk 17-05-2015 00:08 2508172

Цитата:

Цитата Iska
Потому что кошмар вместо кода. »

ну тогда "Ветеран" пожалуйста объясните что не так.

iccup.platoon@vk 17-05-2015 02:09 2508192

Восьмерка ругается на at и предлагает юзать что-то-мам-tasks, который юзать не научен...
Где мой 17 виндовсов ХР =)

ritrs@vk 17-05-2015 02:42 2508195

Цитата:

Цитата iccup.platoon@vk
Восьмерка ругается на at и предлагает юзать что-то-мам-tasks, который юзать не научен...
Где мой 17 виндовсов ХР »

У меня 7ка.

Iska 17-05-2015 06:20 2508208

Цитата:

Цитата ritrs@vk
ну тогда "Ветеран" пожалуйста объясните что не так. »

Всё не так.
  • Уберите все подавители вывода «@» кроме как перед «echo off». Поместите эту команду в начало пакетного файла.
  • Перестаньте использовать транслит. Пишите либо на английском, либо на русском и сохраняйте пакетный файл в кодировке OEM/866.
  • Кавычки в «set /p» могут быть нужны, но только в виде перед всем выражением:
    Код:

    set /p "sVar=Enter some value:"
    В Вашем случае они не нужны вовсе.
  • Начните использовать «говорящие» имена переменных окружения вместо однобуквенных идентификаторов вида «k1», «k2», «ar». Выбор системы произволен. Я бы использовал вместо озвученного, например, «sTime», «sPath», «sChoice», где первая буква — мнемонический признак псевдотипа переменной окружения, к тому же позволяет не пересекаться с существующими системными и пользовательскими переменными окружения, такими, как «PATH». Кто-то для этого добавляет в начало имени переменной знак «$» («$» используется как обязательный признак имени переменной в KiXtart и PowerShell).
  • Вывод в файл, затем чтение из него — зачем? Не вижу никакого смысла и преимущества перед непосредственным созданием задания сразу же. Скрипач не нужен.
  • Кусок кода:
    Код:

    @If %ar%==N goto next
    :next

    можно просто выкинуть — ничего не изменится. Он абсолютно лишний.
  • «Ниасилил»:
    Код:

    if not exist %k2% goto :bad && else
    Командный процессор это тоже не осилит. К тому же Ваша логика — цель и смысл проверки существования только последнего введённого пути — от меня ускользает.
  • Код:

    :bad
    @echo "Programma ne naidena, popro6yem ewe?"
    @goto F
    @del myfile.txt

    Тут вообще сказка. Я теряюсь в поисках логики Ваших действий.

Напишите словами, что Вы хотели, Вам напишут код, каковой должен быть, и дадут пояснения по нему.

ritrs@vk 17-05-2015 15:17 2508361

Цитата:

Цитата Iska
«Ниасилил»:
Код:
Код:

if not exist %k2% goto :bad && else
Командный процессор это тоже не осилит. К тому же Ваша логика — цель и смысл проверки существования только последнего введённого пути — от меня ускользает. »

Ну тут как бы я хотел сделать проверку. То есть перед тем как удалять программу\программы нужно проверить существуют ли они вообще и если нет то отправить сообщение пользователю.


Цитата:

Цитата Iska
Код:
Код:

:bad
@echo "Programma ne naidena, popro6yem ewe?"
@goto F
@del myfile.txt

Тут вообще сказка. Я теряюсь в поисках логики Ваших действий. »

Ну тут как раз и вывод сообщения о том что программы\программ нету и отправка на повторный ввод.

Цитата:

Цитата Iska
Уберите все подавители вывода «@» кроме как перед «echo off». Поместите эту команду в начало пакетного файла. »

Цитата:

Цитата Iska
Кавычки в «set /p» могут быть нужны, но только в виде перед всем выражением:
Код: Выделить весь код
set /p "sVar=Enter some value:"
В Вашем случае они не нужны вовсе.

А тут вы не правы, если убрать кавычки то текст не будет выводитс так как он подавлен @echo off

Ах да, я в принципе "почистил" от того что вы сочли не уместным:

Код:

@echo off
set /P sTime="Enter the time start:  "
:more
set /P sPath="Enter the path to programms:  "
echo %sPath% >> list.txt
set /P sChoice="Let's add one more? Y-yes, N-no:  "
if %sChoice%==Y goto more
@echo off
for /f "tokens=*" %%i in (myfile.txt) do (at "%sTime%" start "%sPath%")
echo "Action successful."
del list.txt
pause>nul

Но результат по прежнему тот же, запуск не удался.

В итоге у меня два вопроса:
1) Как бороться?
2) Как реализовать проверку есть ли программа или нету по заданом пути?

Iska 17-05-2015 16:32 2508391

Цитата:

Цитата Georgio
Iska, а в чём разница с вариантом »

Если я правильно Вас цитирую ;) — в наличии спецсимволов.


Цитата:

Цитата ritrs@vk
А тут вы не правы, если убрать кавычки то текст не будет выводитс так как он подавлен @echo off »

Да ну.
Скрытый текст


Цитата:

Цитата ritrs@vk
Ах да, я в принципе "почистил" от того что вы сочли не уместным: »

Не от всего. Осталось использование промежуточного файла (точнее, теперь двух файлов — в один из которых Вы пишете и удаляете, и второй — из которого Вы пытаетесь читать), два раза «@echo off».

Цитата:

Цитата ritrs@vk
Но результат по прежнему тот же, запуск не удался. »

А что Вы, собственно, запускаете? У Вас есть «start.bat», «start.cmd», «start.com», або «start.exe»? «start.exe» наличествовал в Windows 9x, если мне не изменяет память, под NT его не было. Так что ничего удивительного нет в том, что операционная система не может найти в текущем каталоге и в %PATH% ни одно из перечисленного и исполнить.

ritrs@vk 17-05-2015 16:42 2508396

Цитата:

Цитата Iska
Цитата ritrs@vk:
Код:

А тут вы не правы, если убрать кавычки то текст не будет выводитс так как он подавлен @echo off »
Да ну. »

Ну я говорю как есть.
Я имел ввиду текст который выводится командой echo а не через set.
Цитата:

Цитата Iska
А что Вы, собственно, запускаете? У Вас есть «start.bat», «start.cmd», «start.com», або «start.exe»? «start.exe» наличествовал в Windows 9x, если мне не изменяет память, под NT его не было. Так что ничего удивительного нет в том, что операционная система не может найти в текущем каталоге и в %PATH% ни одно из перечисленного и исполнить. »

командой start я запускаю программу которая расположена по пути %sPath%, разве нет?

Да и в "Назначении задач" отображается иконка программы, тобишь ее путь указан и она найдена, но она не запускается.

Цитата:

Цитата Iska
Не от всего. Осталось использование промежуточного файла (точнее, теперь двух файлов — в один из которых Вы пишете и удаляете, и второй — из которого Вы пытаетесь читать), два раза «@echo off». »

Почему два файла? Один и тот же, я создаю - записываю и удаляю. Где второй?

Iska 17-05-2015 17:01 2508406

Цитата:

Цитата ritrs@vk
Я имел ввиду текст который выводится командой echo а не через set. »

Аналогично:
Скрытый текст


Цитата:

Цитата ritrs@vk
командой start я запускаю программу которая расположена по пути %sPath%, разве нет? »

Команда «start» — внутренняя команда командного процессора (интерпретатор команд) «cmd.exe». И работает она только из-под него. Посему для её использования сначала нужно запустить этот самый командный процессор, наподобие «cmd.exe /c"start "" "bla-bla-bla.exe""». Только вот зачем Вам вообще там «start» нужен?

Цитата:

Цитата ritrs@vk
Да и в "Назначении задач" отображается иконка программы, тобишь ее путь указан и она найдена, но она не запускается. »

«Не верю!» (с).

Скрытый текст



Цитата:

Цитата ritrs@vk
Почему два файла? Один и тот же, я создаю - записываю и удаляю. Где второй? »

Здесь:
Цитата:

Цитата ritrs@vk
Код:

@echo off
set /P sTime="Enter the time start:  "
:more
set /P sPath="Enter the path to programms:  "
echo %sPath% >> list.txt
set /P sChoice="Let's add one more? Y-yes, N-no:  "
if %sChoice%==Y goto more
@echo off
for /f "tokens=*" %%i in (myfile.txt) do (at "%sTime%" start "%sPath%")
echo "Action successful."
del list.txt
pause>nul

»


ritrs@vk 17-05-2015 21:50 2508485

Хорошо, на счёт файлов не заметил. Исправил.
Цитата:

Цитата Iska
Команда «start» — внутренняя команда командного процессора (интерпретатор команд) «cmd.exe». И работает она только из-под него. Посему для её использования сначала нужно запустить этот самый командный процессор, наподобие «cmd.exe /c"start "" "bla-bla-bla.exe""». Только вот зачем Вам вообще там «start» нужен? »

Как тогда мне организовать запуск программы без использования start?

Код:

@echo off
set /P sTime="Enter the time start:  "
:more
set /P sPath="Enter the path to programms:  "
echo %sPath% >> list.txt
set /P sChoice="Let's add one more? Y-yes, N-no:  "
if %sChoice%==Y goto more
for /f "tokens=*" %%i in (list.txt) do (at "%sTime%" start"%sPath%")
echo "Action successful."
del list.txt
pause>nul

Между прочим, в пред. версиях, с моего позволенья "программы" добавляло с иконкой. Честно. А вот теперь действительно не работает. Кстати, что за программа которую вы используете?

Цитата:

Цитата Iska
Только вот зачем Вам вообще там «start» нужен? »

Препод так делал.

Iska 18-05-2015 10:34 2508602

Цитата:

Цитата ritrs@vk
Как тогда мне организовать запуск программы без использования start? »

Как есть, указывая только сам исполняемый файл безо всяких «start».

Цитата:

Цитата ritrs@vk
Между прочим, в пред. версиях, с моего позволенья "программы" добавляло с иконкой. Честно. »

Не верю. «start», как внутренняя команда командного процессора, не может иметь иконки.

Цитата:

Цитата ritrs@vk
Кстати, что за программа которую вы используете? »

Вы про Far Manager?

Цитата:

Цитата ritrs@vk
Препод так делал. »

Если он делал так в данном конкретном случае — то это попросту нелепо.

ritrs@vk 18-05-2015 12:30 2508652

Цитата:

Цитата Iska
Цитата:

Цитата ritrs@vk
Как тогда мне организовать запуск программы без использования start?

»
Как есть, указывая только сам исполняемый файл безо всяких «start». »

Ну тогда у меня появляется ошибка что не правильный синтаксис команды at.
В прочем сейчас еще раз попробую. Просто указать путь к файлу?
Цитата:

Цитата Iska
Цитата:

Цитата ritrs@vk
Между прочим, в пред. версиях, с моего позволенья "программы" добавляло с иконкой. Честно.

»
Не верю. «start», как внутренняя команда командного процессора, не может иметь иконки. »

Я о том что появлялась иконка программы которую я вызывал.

Iska 18-05-2015 15:03 2508695

Цитата:

Цитата ritrs@vk
Ну тогда у меня появляется ошибка что не правильный синтаксис команды at. »

Покажите конечный код. Покажите скриншот с его исполнением и ошибкой.

Цитата:

Цитата ritrs@vk
Я о том что появлялась иконка программы которую я вызывал. »

И я о том же. Не может там быть у «start» иконки.

ritrs@vk 18-05-2015 17:34 2508746

Код:

Код:

@echo off
set /P sTime="Enter the time start:  "
:more
set /P sPath="Enter the path to programms:  "
echo %sPath% >> list.txt
set /P sChoice="Let's add one more? Y-yes, N-no:  "
if %sChoice%==Y goto more
for /f "tokens=*" %%i in (list.txt) do (at "%sTime%" start file"%sPath%")
echo "Action successful."
del list.txt
pause>nul

Изображение

ritrs@vk 20-05-2015 19:42 2509509

Iska, ну так что? Ничем не поможете?

Iska 22-05-2015 16:45 2510276

Код пакетного файла:
Скрытый текст
Код:

@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=
set /p sPath=Enter path to program:

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 %sTime% /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


Пример выполнения кода:
Скрытый текст

Запуск созданных в примере заданий из Планировщика:
Скрытый текст

ritrs@vk 22-05-2015 21:34 2510397

Большое спасибо, Iska. На досуге просмотрю код. Можете объяснить команду setLocal?

Iska 22-05-2015 21:40 2510402

Цитата:

Цитата ritrs@vk
Можете объяснить команду setLocal? »

Код:

setlocal /?
Если после прочтения останутся вопросы — спрашивайте.

ritrs@vk 22-05-2015 23:23 2510435

Цитата:

Цитата Iska
Если после прочтения останутся вопросы — спрашивайте. »

Ну я так понял setlocal создает локальную среду относительно текущего файла? А в чём ее особености?

Iska 23-05-2015 02:18 2510454

Цитата:

Цитата ritrs@vk
Ну я так понял setlocal создает локальную среду относительно текущего файла? »

В рамках setlocal/endlocal (если endlocal отсутствует — выполняется неявная команда endlocal при завершении текущего контекста пакетного файла).

Цитата:

Цитата ritrs@vk
А в чём ее особености? »

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

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

ritrs@vk 23-05-2015 23:31 2510724

Цитата:

Цитата Iska
Iska »

а в чём конкретно была ошибка в моем коде? Можно сделать так как я делал? Просто при сдаче, мне прийдется еще объяснять об этой локальной среде.

Iska 23-05-2015 23:37 2510729

Цитата:

Цитата ritrs@vk
а в чём конкретно была ошибка в моем коде? »

См. пост #2.

Дело вовсе не в одной, какой-то конкретной ошибке (ошибок по-прежнему куча). Порочен сам использованный подход.

ritrs@vk 23-05-2015 23:48 2510737

Или тогда проверьте правильно ли я понимаю действия вашей программы:

Код:

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

Цитата:

Цитата ritrs@vk
setlocal enableextensions enabledelayedexpansion // ОБЪЯВЛЕНИЕ ЛОКАЛЬНОЙ СРЕДЫ »

…с одновременным включением расширенной обработки команд и отложенного раскрытия переменных окружения.

Цитата:

Цитата ritrs@vk
set sTime= //ВВОД ВРЕМЕНИ (?) »

Удаление переменной окружения.

Цитата:

Цитата ritrs@vk
set /p sTime=Enter time for start programs [hh:mm]: //ВВОД ВРЕМЕНИ (?) ДВА РАЗА ЧТО ЛИ? »

Ввод — только здесь. Один раз. Предыдущая команда, напротив, удаляла (если она была ранее задана) эту переменную окружения.

Цитата:

Цитата ritrs@vk
if not defined sTime ( //В СЛУЧАИ ЕСЛИ НЕ ВВЕДЕНО НА МЕТКУ ПОВТОРА »

Да. Только чуть иначе — «если переменная не определена», то, значит, ничего не было введено, и потому — переходим к указанной метке.

Цитата:

Цитата ritrs@vk
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» устанавливает код козврата отличным от нуля. Соответственно, в этом случае выполняется команда, идущая вслед за «||».

Цитата:

Цитата ritrs@vk
set sPath= //ВВОД ПУТИ (2) »

См. объяснение выше аналогично «set sTime=».

Цитата:

Цитата ritrs@vk
if not defined sPath ( //ЕСЛИ НЕ ВВЕДЕНО НА МЕТКУ ПОВТОРА »

См. объяснение выше аналогично «if not defined sTime …».

Цитата:

Цитата ritrs@vk
at.exe %time% /interactive "%sPath%" //ЗАПУСК ПРОГРАММЫ »

Создание задания.

Цитата:

Цитата ritrs@vk
set sChoice= //ВЫБОР ПОВТОРИТЬ ИЛИ НЕТ »

См. объяснение выше аналогично «set sTime=».

Цитата:

Цитата ritrs@vk
if exist "%SystemRoot%\System32\choice.exe" ( //ВЫВОД ВЫБОРА С ИСП, ПРОГРАММЫ ЧОИС »

Если у Вас есть NT6.x — используем «choice.exe», иначе — «set /p».

ritrs@vk 24-05-2015 11:39 2510816

Есть проблема. Когда я запускаю К.Ф. устанавливаю время и указываю путь к программе время запуска устанавливается то которое сейчас на компьютере. Прилагаю скрин.
Скрытый текст


НАШЕЛ ОШИБКУ:

Цитата:

Цитата Iska
at.exe %time% /interactive "%sPath%"

Переменная то sTime а не Time.

Хм..пишет в "Статус" что программа работает, но на рабочем столе ее нету, да и в диспетчере задач тоже.
[ИСПРАВЛЕНО] Походу у меня ОС была слишком нагружена. Сейчас перезапустил все отлично работает.
Цитата:

Цитата Iska
Передаём по конвейеру команде «findstr.exe» вывод команды «echo», а именно — содержимое переменной окружения «sTime», введённое время. Команда «findstr.exe» читает со стандартного ввода переданную строку и проверяет её по указанному шаблону. Если нет соответствия полученной строки указанному шаблону, команда «findstr.exe» устанавливает код козврата отличным от нуля. Соответственно, в этом случае выполняется команда, идущая вслед за «||». »


Можно это заменить на какой нибудь более простой аналог?

ritrs@vk 24-05-2015 12:35 2510829

Цитата:

Цитата ritrs@vk
Передаём по конвейеру команде «findstr.exe» вывод команды «echo», а именно — содержимое переменной окружения «sTime», введённое время. Команда «findstr.exe» читает со стандартного ввода переданную строку и проверяет её по указанному шаблону. Если нет соответствия полученной строки указанному шаблону, команда «findstr.exe» устанавливает код козврата отличным от нуля. Соответственно, в этом случае выполняется команда, идущая вслед за «||». »
Можно это заменить на какой нибудь более простой аналог? »

Я понял. Это проверка на формат времени, так?

ritrs@vk 24-05-2015 13:26 2510842

Все. Я сделал эту программу. Большое спасибо вам, Iska. Много чего узнал полезного, понял как не надо кодить, узнал принцип построения кода(такое ощущение что я пишу здесь Итог для курсовой).

Iska 24-05-2015 16:06 2510899

Цитата:

Цитата ritrs@vk
НАШЕЛ ОШИБКУ: »

Угу, есть такое ;). Поправил своё оригинальное сообщение.

Цитата:

Цитата ritrs@vk
Можно это заменить на какой нибудь более простой аналог? »

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

Цитата:

Цитата ritrs@vk
Я понял. Это проверка на формат времени, так? »

Да. Насколько это возможно — что введённая строка соответствует шаблону.


Время: 21:30.

Время: 21:30.
© OSzone.net 2001-