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

o3epo 06-10-2012 01:51 2000307

Прервать цикл
 
Возможно ли прервать данный цикл (кроме как Ctrl+Pause) что бы был вариант выбора: 1)перейти к какой-либо команде; 0)выйти?

Код:

@echo off
echo Задача завершена. Нажмите 1 для перехода в меню, 0 для выхода из программы.
:loop  cls  color e2
ping 127.0.0.1 -n 2 >nul
color 2e
ping 127.0.0.1 -n 3 >nul
goto loop

Или по другому - что бы до ответа пользователя ( при set /p dialog= ) окно с результатами циклически меняло цвет.

Anonymоus 06-10-2012 04:40 2000318

o3epo, используйте это, как образец. Можете сделать и по другому, главное - чтобы вы уловили идею, за счет чего реализовано неблокирующее ожидание ввода чего-либо пользователем.
Код:

@Echo Off
:: Проверка на то, проихводится ли вторичный запуск батника
If "%Thread1Started%"=="true" GoTo Thread2

:Thread1
:: Запуск второй копии, циклично меняющей цвета в консоли
Set Thread1Started=true
Start /B "" "%~nx0"
:: Здесь ожидается команда от пользователя
:WaitCmds
Cls
:: Приглашение к вводу
Set /P Cmd=  Enter your command:^>
:: Проверка на пустое значение
If "%Cmd%"=="" (GoTo WaitCmds) Else (Echo.>"%Temp%\ready.tmp")
:: Вывод команды, к этому времени смена цвета должна прекратиться
Echo.
Echo Command is: "%Cmd%"
Pause&Exit

:Thread2
:: У каждого из цветов одинаковая, достаточно небольшая задержка
:: Проверка на наличие файла-флага, извещающего о введенной команде
If Exist "%Temp%\ready.tmp" (Del "%Temp%\ready.tmp"&Color f0&Exit)
Color f0
Ping -n 2 127.0.0.1>nul
If Exist "%Temp%\ready.tmp" (Del "%Temp%\ready.tmp"&Color f0&Exit)
Color 0f
Ping -n 2 127.0.0.1>nul
GoTo Thread2


o3epo 06-10-2012 20:40 2000558

Вложений: 1
Встроить в сам файл не получилось, оформил в отдельный с вызовом через call, но вызов срабатывает только в одном из двух режимов. В архиве, собственно, то, куда я это хочу встроить. Я так думаю, что то, что я там "наконструировал" ещё можно хорошо оптимизировать. Моих мозгов для этого ещё пока недостаёт. Если не трудно, помогите, пожалуйста.

Masutin 15-11-2017 01:19 2777630

Можно осуществить нечто вроде?
Код:

set /p q=Нажмите Enter для завершения или любую другую клавишу для продолжения.
if q==* goto l else exit


Iska 15-11-2017 03:15 2777641

Цитата:

Цитата Masutin
Можно осуществить нечто вроде? »

Вы словами опишите задачу.

Masutin 25-11-2017 00:06 2780015

Возможно ли условие подобно нажатию Ctrl+C?
Результаты работы цикла проверяются вручную. Возможно ли условие для выхода или повтора? Например, между pause&goto и pause&exit, задав ввод некого текста либо иначе условие повтора или окончания?

Iska 25-11-2017 00:34 2780020

Masutin, Вы что-то такое хотите получить:
Код:

:Repeat
        echo bla-bla-bla
        echo bla-bla-bla
        echo bla-bla-bla
       
        set /p sVar=Repeat?
       
        if defined sVar if /i "%sVar%" equ "y" goto :Repeat

?!

На новых ОС вместо set /p можно пользовать «choice.exe»:
Код:

:Repeat
        echo bla-bla-bla
        echo bla-bla-bla
        echo bla-bla-bla
       
        choice.exe /m "Repeat?"
       
        if %errorlevel% equ 1 goto :Repeat

Вкупе к прочему, для choice.exe можно задать таймаут ответа и умолчание, буде таковая необходимость.

Masutin 27-11-2017 20:08 2780567

Если при выполнении Вашего кода
Код:

:Repeat
set /p sVar=Repeat?
if defined sVar if /i "%sVar%" equ "y" goto :Repeat

до первого повтора цикла нажать Enter без ввода буквы, окно закроется. Если после повтора цикла нажать Enter без ввода буквы, это считается вводом предыдущего выбора, и цикл повторится. Можно ли задать для Enter (без буквы) то или иное действие?

Iska 28-11-2017 05:07 2780638

Цитата:

Цитата Masutin
до первого повтора цикла нажать Enter без ввода буквы, окно закроется. »

Так и задумывалось.

Цитата:

Цитата Masutin
Если после повтора цикла нажать Enter без ввода буквы, это считается вводом предыдущего выбора, и цикл повторится. »

К сожалению, да. Вот так странно работает set /p.
Код:

:Repeat
        set sVar=
       
        echo bla-bla-bla
        echo bla-bla-bla
        echo bla-bla-bla
       
        set /p sVar=Repeat?
       
        if defined sVar if /i "%sVar%" equ "y" goto :Repeat

Цитата:

Цитата Masutin
Можно ли задать для Enter (без буквы) то или иное действие? »

Код:

@echo off
setlocal enableextensions enabledelayedexpansion

:Repeat
        set sVar=
       
        echo bla-bla-bla
        echo bla-bla-bla
        echo bla-bla-bla
       
        set /p sVar=Repeat? && (
                if defined sVar if /i "!sVar!" equ "y" goto :Repeat
        ) || (
                echo то или иное действие для Enter без буквы
        )

endlocal
exit /b 0



Время: 12:07.

Время: 12:07.
© OSzone.net 2001-