Цитата root221:
надо что бы скрипт не зацикливался, а давал мне возможность во время исполнения команды t вводить, другие команды.
так не прокатывает, он зацикливается на одном и не даёт мне ввести другой параметр.... »
|
А вы не забываете, что консоль-то у нас однозадачная? Она не умеет что-то делать в фоне, и одновременно с этим работать с чем-то ещё. Одновременно может исполняться только одна задача.
Но с помощью вот такого нехитрого трюка можно сделать псевдо-"многозадачность", запуская несколько процессов одного и того же скрипта внутри самого себя. Первый - ожидает команды от пользователя и передает их, второй - получает команды от первого, обрабатывает и передает управление на нужную метку. А там - смотря по ситуации, в случае с командой "t" - запускает в фоне третий процесс, который пингует нужный хост, в случае с командой "test" - просто выводит надпись, не стартуя ещё одного процесса.
Код:

@Echo Off
:: Назначаем временный файл, с помощью которого будут передаваться команды
Set CmdFile=%Temp%\cmd_%Random%.tmp
:: Проверка на запуск второй копии
If "%SelfStart%"=="" (GoTo ControlThread)
:Main
:: Если команды от первой копии ещё не поступало, ждем в цикле
If Not Exist "%CmdFile%" Ping -n 3 127.0.0.1>nul& GoTo Main
Set /P UserCmd=<"%CmdFile%"
:: Проверка на существование метки, перенаправление
Find /I ":[%UserCmd%]" "%~nx0">nul&&(
Del "%CmdFile%"
GoTo [%UserCmd%]
)||(
Del "%CmdFile%"
Echo Command not found
GoTo Main
)
:: Запускаем ещё одну копию скрипта, обрабатывающую команды от первой
:ControlThread
If "%SelfStart%"=="" (
Set SelfStart=yes
Start /B "" "%~nx0"
GoTo WaitUserUserCmds
)
:: Ждем команду от пользователя, перенаправляем второй копии
:WaitUserUserCmds
Cls
Echo Enter your command:
If Not "%UserCmd%"=="" (Echo ^> %UserCmd%)
Set UserCmd=
Set /P UserCmd=
If Not "%UserCmd%"=="" Echo %UserCmd%>"%CmdFile%"
GoTo WaitUserUserCmds
:: Здесь находятся метки-"команды", каждая после завершения работы возвращает управление на main
:[test]
:: Тестовая команда для проверки
Echo.
Echo TEST
Echo.
GoTo Main
:[t]
:: Создаем временный батник, который и запускаем внутри того же окна в фоне, третьим процессом
:: Можно бы было сделать проверку на повторный ввод команды, если уже запущена, но лень играться с флагами
>"%Temp%\sendmsg.cmd" (
Echo @echo off
Echo :sendmsg
Echo ^>nul ping 10.0.0.5 -n 1 -w 100 ^&^& ^(msg * Соединение установлено ^& exit /b^)
Echo call :sendmsg
)
Start /B "" "%Temp%\sendmsg.cmd"
Echo Мониторинг доступности 10.0.0.5 запущен
GoTo Main