Работа циклов (нужны разъяснения)

alex_diablo

Постоянный участник
Сообщения
144
Реакции
9
Доброго времени суток. Так как циклы для меня темный лес, хотелось бы попытаться все же в них хоть немного разобраться.
Прошу пояснить принцип работы на следующем скрипте:

CMD/BATCH:
@echo off
SetLocal EnableExtensions

set "ver=5.3.5p5"
set "bit=UnitySetup64"

set "command=wget -q --force-html -O- --level=1 --no-cache --retry-connrefused --tries=3 --connect-timeout=5 --no-check-certificate https://unity3d.com/ru/unity/qa/patch-releases/"

echo %command%

pause


for /f UseBackQ^ tokens^=2^ delims^=^" %%a in (`%command% ^| find /i "%bit%" ^| find /i "%ver%"`) do (
rem echo "%%a"
  for /f "tokens=4 delims=/" %%b in ("%%a") do set "url=%%b"
  goto end
)
:end

echo %url%

pause
exit /B

если можно - прям расписать, где какой и для чего символ или команда использованы...
также было бы здорово получить пояснения по работе wget в данном скрипте.
 
Последнее редактирование:
По параметрам wget можно почитать встроенную справку.
Код:
wget --help
По большей части там большинство ключей для надежности.
Единственное: -O- - это принудительный вывод скаченного соедржимого на экран консоли вместо файла.

По циклам. Начну со средины:
CMD/BATCH:
for /f "tokens=4 delims=/" %%b in ("%%a") do set "url=%%b"
В переменной %%a будет хранится http-адрес. В данном случае:
hxxp://beta.unity3d.com/download/2fb591d65635/Windows64EditorInstaller/UnitySetup64-5.3.5p5.exe

Мы подставляем эту строку для обработки парсером цикла, чтобы выделить жирную часть.
Делить будем по знакам /. Каждая разделённая часть называется токеном.
В результате получится:

Токен_1//Токен_2/Токен_3/Токен_4/Токен_5/Токен_6

Если сравнить эту строку со строкой выше, то всё будет понятно. Т.е. мы вручную сосчитали, какой номер токена нам нужен.
2fb591d65635 находится под номером 4.

Составляем сам цикл:
CMD/BATCH:
for /f "tokens=4 delims=/" %%b in ("%%a") do set "url=%%b"
Здесь всё тоже самое.
Указали номер извлекаемого токена: tokens=4
Разделитель: delims=/
Указали букву, в которую будет попадать 4-й токен: %%b (букву a нельзя т.к. она уже занята первым циклом).
Дальше присваиваем глобальной переменной батника результат: set url=%%b
___________________________________

1-й цикл:
Там всё тоже самое:
CMD/BATCH:
for /f UseBackQ^ tokens^=2^ delims^=^" %%a in (`%command% ^| find /i "%bit%" ^| find /i "%ver%"`) do (
Можно было проще написать:
CMD/BATCH:
for /f tokens^=2^ delims^=^" %%a in ('%command% ^| find /i "%bit%" ^| find /i "%ver%"') do (
Только синтаксис немного отличается из-за того, что разделитель - кавычка "
Приходится таким вот странным образом экранировать птичкой ^ часть символов.

В отличие от цикла № 2 здесь мы сперва выполняем команду, а парсим уже результат от нее.
Как это понимает цикл? - По виду кавычек внутри скобок.
См.:

... ("строка") do - произойдёт парсинг строки
... ('команда') do - произойдет парсинг результата от выполнения команды

всё доступно в справке по команде for
CMD/BATCH:
for /?
CMD/BATCH:
%command% ^| find /i "%bit%" ^| find /i "%ver%"
Здесь птички ^ обязательны, т.к. спецсимволы внутри скобок цикла нужно экранировать, чтобы батник воспринял их как строковой литерал, а не настоящий спецсимвол.
%command% - раскрывается переменная с командой и выполняется wget, его результат передается к find. Она выводит только строки с нужной битностью,
передает к очередному фильтру find. Он отсекает еще больше строк - только конкретную версию.

Результат обрабатывается парсером цикла по тем же правилам, что и в цикле № 2.

goto end - досрочный выход из цикла (т.е. чтение только первой строки вывода команды).
 
Ну в смысле откуда? Сам написал. Вот:

for /f "tokens=4 delims=/" %%b in ("%%a") do set "url=%%b"
Только синтаксис немного отличается из-за того, что разделитель - кавычка "
А это здесь при чём?
Это сообщение относится к циклу № 1.
 
Назад
Сверху Снизу