батник с goto loop внутри for - преждевременный выход из for?

astart
Дата: 28.04.2018 05:13:51
Всем доброго времени суток. Есть следующий батник
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 содержит строки вида
"имя файла","урл файла"
Изначально goto цикла не было, но сервер, с которого идёт скачивание, часто и непредсказуемо выбрасывал ошибки ssl соединения.
Однако после добавления goto стала обрабатываться только первая строка файла, после чего батник завершается без сообщений об ошибках (без goto цикла обрабатывались все строки, но большая часть файлов просто не скачивалась)
+ вывод консоли:
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-а после обработки одной строки?
astart
Дата: 28.04.2018 06:48:48
Добавлю - пока goto не срабатывает(т.е. если файл скачивается с первой попытки), строки обрабатываются нормально. Сам goto цикл выполняется до тех пор, пока файл не будет скачан. Сразу после этого происходит выход из for.
Akina
Дата: 28.04.2018 07:33:55
Внешний процесс следует запускать как start /w cmd /c команда - тогда контекст исполнения не поплывёт.
Basil A. Sidorov
Дата: 28.04.2018 09:30:33
astart
...
"путь_к_курлу\curl.exe" -# --tlsv1 -4 -L0 -o !dfile! !dlink!
...
Файл dlist.txt содержит строки вида
Что же вы такие странные-то ...
Если уж нельзя сразу приготовить файл нужного формата, то взяли исходник, преобразовали его в формат, понимаемый curl-ом и скормили этот файл одной командой.

P.S. Если хочется обработать в цикле сложный пакет команд, то:
 call /?
...
Команда CALL допускает использование меток в качестве адресата вызова.
Применяется следующий синтаксис:
CALL :метка аргументы
...
astart
Дата: 28.04.2018 09:41:33
Basil A. Sidorov
преобразовали его в формат, понимаемый curl-ом и скормили этот файл одной командой.
И эта конструкция благополучно пропустит все файлы с ошибкой 35, не так ли?

Akina, спасибо за совет.
Basil A. Sidorov
Дата: 28.04.2018 10:13:55
astart
И эта конструкция благополучно пропустит все файлы с ошибкой 35, не так ли?
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
astart
Дата: 28.04.2018 11:18:59
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 это будет работать. А может, и не будет.
Basil A. Sidorov
Дата: 28.04.2018 13:34:58
astart
м.б., в связке с retry-connrefused это будет работать. А может, и не будет.
У меня нет под руками сервера, который более-менее стабильно выдаёт ошибки.
И скачиваю, обычно, wget-ом, который много проще curl-а на самой типичной задаче.

Резюмирую.
Мне нетрудно, посмотреть за вас справку, выдаваемую утилитой, но я не собираюсь проверять, насколько это вам подходит.