powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / батник с goto loop внутри for - преждевременный выход из for?
8 сообщений из 8, страница 1 из 1
батник с goto loop внутри for - преждевременный выход из for?
    #39637799
astart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток. Есть следующий батник
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
cls
SETLOCAL EnableDelayedExpansion
echo off
FOR /F "tokens=1,2 delims=,"  %%i in (dlist.txt) do (
set dfile="docs/%%~i"
set dlink=%%~j
echo !dfile! - !dlink! - start
:dl
"путь_к_курлу\curl.exe" -# --tlsv1 -4 -L0 -o !dfile!  !dlink!
IF NOT EXIST !dfile! (
echo !dfile! - retry
goto dl
)
)

Файл dlist.txt содержит строки вида
Код: plaintext
"имя файла","урл файла"
Изначально goto цикла не было, но сервер, с которого идёт скачивание, часто и непредсказуемо выбрасывал ошибки ssl соединения.
Однако после добавления goto стала обрабатываться только первая строка файла, после чего батник завершается без сообщений об ошибках (без goto цикла обрабатывались все строки, но большая часть файлов просто не скачивалась)
вывод консоли:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
D:\tmp\_sb>SETLOCAL EnableDelayedExpansion

D:\tmp\_sb>echo off
"имя_файла" - урл - start

curl: (35) Unknown SSL protocol error in connection to сайт:443
"имя_файла" - retry

curl: (35) Unknown SSL protocol error in connection to сайт:443
"имя_файла" - retry

<ещё куча повторов...>

curl: (35) Unknown SSL protocol error in connection to сайт:443
"имя_файла" - retry
######################################################################## 100.0%
D:\tmp\_sb>

Вопрос - почему здесь происходит выход из FOR-а после обработки одной строки?
...
Рейтинг: 0 / 0
батник с goto loop внутри for - преждевременный выход из for?
    #39637812
astart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добавлю - пока goto не срабатывает(т.е. если файл скачивается с первой попытки), строки обрабатываются нормально. Сам goto цикл выполняется до тех пор, пока файл не будет скачан. Сразу после этого происходит выход из for.
...
Рейтинг: 0 / 0
батник с goto loop внутри for - преждевременный выход из for?
    #39637829
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Внешний процесс следует запускать как start /w cmd /c команда - тогда контекст исполнения не поплывёт.
...
Рейтинг: 0 / 0
батник с goto loop внутри for - преждевременный выход из for?
    #39637869
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
astart
Код: plaintext
1.
2.
...
"путь_к_курлу\curl.exe" -# --tlsv1 -4 -L0 -o !dfile!  !dlink!
...
Файл dlist.txt содержит строки видаЧто же вы такие странные-то ...
Если уж нельзя сразу приготовить файл нужного формата, то взяли исходник, преобразовали его в формат, понимаемый curl-ом и скормили этот файл одной командой.

P.S. Если хочется обработать в цикле сложный пакет команд, то:
Код: plaintext
1.
2.
3.
4.
5.
 call /?
 ...
 Команда CALL допускает использование меток в качестве адресата вызова.
 Применяется следующий синтаксис:
    CALL :метка аргументы
 ...
...
Рейтинг: 0 / 0
батник с goto loop внутри for - преждевременный выход из for?
    #39637874
astart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovпреобразовали его в формат, понимаемый curl-ом и скормили этот файл одной командой.И эта конструкция благополучно пропустит все файлы с ошибкой 35, не так ли?

Akina, спасибо за совет.
...
Рейтинг: 0 / 0
батник с goto loop внутри for - преждевременный выход из for?
    #39637888
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
astartИ эта конструкция благополучно пропустит все файлы с ошибкой 35, не так ли?
Код: plaintext
1.
2.
3.
4.
curl --help|find "retry"
     --retry <num>   Retry request if transient problems occur
     --retry-connrefused Retry on connection refused (use with --retry)
     --retry-delay <seconds> Wait time between retries
     --retry-max-time <seconds> Retry only within this period
...
Рейтинг: 0 / 0
батник с goto loop внутри for - преждевременный выход из for?
    #39637925
astart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorov, "...но есть один нюанс" (с)
автор--retry <num>

If a transient error is returned when curl tries to perform a transfer, it will retry this number of times before giving up. Setting the number to 0 makes curl do no retries (which is the default). Transient error means either: a timeout, an FTP 4xx response code or an HTTP 5xx response code . м.б., в связке с retry-connrefused это будет работать. А может, и не будет.
...
Рейтинг: 0 / 0
батник с goto loop внутри for - преждевременный выход из for?
    #39638014
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
astartм.б., в связке с retry-connrefused это будет работать. А может, и не будет.У меня нет под руками сервера, который более-менее стабильно выдаёт ошибки.
И скачиваю, обычно, wget-ом, который много проще curl-а на самой типичной задаче.

Резюмирую.
Мне нетрудно, посмотреть за вас справку, выдаваемую утилитой, но я не собираюсь проверять, насколько это вам подходит.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / батник с goto loop внутри for - преждевременный выход из for?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]