Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / батник с goto loop внутри for - преждевременный выход из for? / 8 сообщений из 8, страница 1 из 1
28.04.2018, 05:13
    #39637799
astart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
батник с goto loop внутри for - преждевременный выход из for?
Всем доброго времени суток. Есть следующий батник
Код: 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
28.04.2018, 06:48
    #39637812
astart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
батник с goto loop внутри for - преждевременный выход из for?
Добавлю - пока goto не срабатывает(т.е. если файл скачивается с первой попытки), строки обрабатываются нормально. Сам goto цикл выполняется до тех пор, пока файл не будет скачан. Сразу после этого происходит выход из for.
...
Рейтинг: 0 / 0
28.04.2018, 07:33
    #39637829
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
батник с goto loop внутри for - преждевременный выход из for?
Внешний процесс следует запускать как start /w cmd /c команда - тогда контекст исполнения не поплывёт.
...
Рейтинг: 0 / 0
28.04.2018, 09:30
    #39637869
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
батник с goto loop внутри for - преждевременный выход из for?
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
28.04.2018, 09:41
    #39637874
astart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
батник с goto loop внутри for - преждевременный выход из for?
Basil A. Sidorovпреобразовали его в формат, понимаемый curl-ом и скормили этот файл одной командой.И эта конструкция благополучно пропустит все файлы с ошибкой 35, не так ли?

Akina, спасибо за совет.
...
Рейтинг: 0 / 0
28.04.2018, 10:13
    #39637888
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
батник с goto loop внутри for - преждевременный выход из for?
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
28.04.2018, 11:18
    #39637925
astart
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
батник с goto loop внутри for - преждевременный выход из for?
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
28.04.2018, 13:34
    #39638014
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
батник с goto loop внутри for - преждевременный выход из for?
astartм.б., в связке с retry-connrefused это будет работать. А может, и не будет.У меня нет под руками сервера, который более-менее стабильно выдаёт ошибки.
И скачиваю, обычно, wget-ом, который много проще curl-а на самой типичной задаче.

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


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