• Администрация SafeZone приветствует вас на нашем форуме!
    Если вы больше не желаете видеть рекламу при просмотре тем и сообщений - то достаточно просто зарегистрироваться. Для зарегистрированных пользователей реклама не отображается.

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

alex_diablo

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

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 в данном скрипте.
 
Последнее редактирование:

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#2
По параметрам 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 - досрочный выход из цикла (т.е. чтение только первой строки вывода команды).
 

alex_diablo

Пользователь
Сообщения
115
Симпатии
7
#3
спасибо, вроде потихоньку вникаю... только не совсем понял, откуда у нас во 2 цикле взялись кавычки?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#4
Какие конкретно?
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#6
Ну в смысле откуда? Сам написал. Вот:

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

alex_diablo

Пользователь
Сообщения
115
Симпатии
7
#7
все. понял. мы же в 1 цикле получаем ссылку на файл, а она у нас в строке заключена в кавычки.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
5,413
Симпатии
5,278
#8
Если будут нужны еще подробности, есть развернутая статья, разделённая на 3 части:
1. Общее описание и упражнения
2. Особенности и ограничения.
3. Практические примеры.

Циклические операции и примеры (команда FOR)