Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
Dragokas
Эксперт WindowsАвтор FAQ
17098 / 7153 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
1

Как выйти из бесконечного цикла?

14.10.2012, 23:47. Просмотров 5050. Ответов 5
Метки нет (Все метки)

Есть вот такая специфическая форма записи бесконечного цикла:

Bash
1
2
3
for /L %%a in (0,0,0) do goto :nxt
:nxt
pause
Мне нужно перейти по метке.
Именно перейти, а не вообще выйти из скрипта.

А вот не получается, хоть визуально и должно.
Команда Exit работает, Goto - нет.

Добавлено через 6 минут
прибегнул к хитрости:
Bash
1
2
3
4
5
6
7
for /L %%a in (0,0,0) do call :redirection
:nxt
pause
exit
 
:redirection
goto :nxt
Но ведь "это не наш метод"
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2012, 23:47
Ответы с готовыми решениями:

Не могу выйти из цикла с GOTO!
echo off echo Begin :: записываем в переменную атрибут %1 set atribut=%1 :: смещаем параметр...

Выбрать первую строку и выйти из вложенного цикла
Блин, уже вечер, нифига не соображу... Задача: В цикле прогнать N файлов, в которых найти цифу. ...

Что может быть причиной бесконечного цикла в bat-файле?
причем на одной из машин (NT). на другой - нормально выполняется. вот такое там внутри (тэга...

Старый борланд: как выйти из бесконечного цикла по нажатию заданной клавиши?
Короче нужно сделать прогу которая считает сколько отрицательных,положительных,равных 0 ввел...

Не могу выйти с бесконечного цикла
Есть код, пробую запустить в emu8086, но не могу выйти с бесконечного цикла суть задания - Поиск и...

5
Dragokas
Эксперт WindowsАвтор FAQ
17098 / 7153 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
16.10.2012, 06:20  [ТС] 2
Вообщем пока, лучше пользоваться дедовским методом:

Bash
1
2
3
:Start
::Наш код
Goto :Start
А первым случаем пользоваться, когда требуется записать код в одну строку.
Например, такое может понадобится для Shell: Самоуничтожения программы
0
gimntut
883 / 185 / 16
Регистрация: 18.07.2011
Сообщений: 260
11.12.2012, 15:31 3
Если рассматривать такой код
Bash
1
for /L %%a in (0,0,0) do goto :nxt
как
Bash
1
FOR.EXE /L %%a in (0,0,0) do goto :nxt
то станет понятно, почему нужно использовать двойные проценты и почему goto не работает.

Вот аналогичный пример:
1.cmd
Bash
1
2
call 2.cmd
:stop

2.cmd
Bash
1
goto :stop
0
Dragokas
Эксперт WindowsАвтор FAQ
17098 / 7153 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
12.12.2012, 17:28  [ТС] 4
Цитата Сообщение от gimntut Посмотреть сообщение
Если рассматривать такой код
for /L %%a in (0,0,0) do goto :nxt
как
FOR.EXE /L %%a in (0,0,0) do goto :nxt
то станет понятно, почему нужно использовать двойные проценты и почему goto не работает.
Про двойные проценты, если честно, не понял.
Они нужны потому, как в среде интерпретируются как 1 знак %. А сам процент - арифметический оператор.

Про FOR.EXE тоже намек не совсем понял. Вы имеете в виду, если FOR рассматривать, как внешнюю программу, тогда она не увидит мою метку... Но ведь это не есть совершенно другая среда, как в примере с "Call 2.cmd".
Ведь такой вариант работает! :
Bash
1
2
for /L %%A in (0,1,2) do (echo here& goto :nxt)
:nxt
Хотя и здесь тоже примечательно, что интерпретатор рассматривал операционную часть (echo here& goto :nxt) - 3 раза как задано в условиях, но как видно из консоли - не выполнял ее на 2-й и 3-ей итерации:
Как выйти из бесконечного цикла?
0
gimntut
883 / 185 / 16
Регистрация: 18.07.2011
Сообщений: 260
12.12.2012, 17:47 5
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Dragokas Посмотреть сообщение
Но ведь это не есть совершенно другая среда
В точку!
Если бы была другая среда, то if...goto не работало бы.
Хотя среда остаётся той же, но правила для параметров for такие же как и для внешних программ.
Если попробовать передать внешней программе строку начинающуюся на %, то ничего хорошего из этого не выйдет.
А %% передаётся как внутрь for, как %. Когда for работает не из батника, то достаточно одинарного процента, т.к. в таком случае for как бы самостоятельная программа.
На самом деле for не является самостоятельной. Но если её воспринимать таковой, то можно избежать проблема подобных описанной.
0
Dragokas
Эксперт WindowsАвтор FAQ
17098 / 7153 / 861
Регистрация: 25.12.2011
Сообщений: 10,954
Записей в блоге: 16
13.12.2012, 13:18  [ТС] 6
Собственно из своего же скрина я понял почему не получается выход из такого цикла.
Как видим, несмотря на goto при условии в 3 итерации команда For просматривает оперируемую часть все 3 раза.

Соответственно для бесконечного числа итераций, For не может завершить обработку, т.к. таких частей после Do будет рассмотрено бесконечное кол-во.

Что примечательно, саму метку вне цикла его среда видит.
Это можно увидеть из эксперимента:
Bash
1
2
FOR /L %%a in (0,1,2) do goto :nxt
pause
Как выйти из бесконечного цикла?

Интерпретатор закрывается аварийно.

Т.е. даже некорректная команда не может заставить выйти из цикла после первой итерации.
Единственный способ выхода - это завершить работу сценария:
Bash
1
2
3
Echo. 1>&3 2>&4 3>test.log 4>&3
FOR /L %%a in (0,1,2) do exit
pause
Цитата Сообщение от test.log
D:\_PRO\CMD-BAT\Test>FOR /L %a in (0 1 2) do exit

D:\_PRO\CMD-BAT\Test>exit
0
13.12.2012, 13:18
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2012, 13:18

Как выйти из цикла?
Здрасьте!Я новичок, и у меня достаточно глупый вопрос. Как тут реализовать выход из цикла? ...

do while - как выйти из цикла?
Подскажите пожалуйста, а то я уже всю голову "сломал", почему при вводе "А" цикл не прерывается???...

Как выйти из цикла
Помогите пож дописать макрос! Нужно найти номер позиции первой буквы кириллицы в строке как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.