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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем alex_diablo, 28 июн 2016.

  1. alex_diablo
    Оффлайн

    alex_diablo Пользователь

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

    Код (DOS):
    @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 в данном скрипте.
     
    Последнее редактирование: 28 июн 2016
    Kиpилл нравится это.
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    По параметрам wget можно почитать встроенную справку.
    Код (Text):

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

    По циклам. Начну со средины:
    Код (DOS):

    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.

    Составляем сам цикл:
    Код (DOS):

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

    1-й цикл:
    Там всё тоже самое:
    Код (DOS):

    for /f UseBackQ^ tokens^=2^ delims^=^" %%a in (`%command% ^| find /i "%bit%" ^| find /i "%ver%"`) do (
     
    Можно было проще написать:
    Код (DOS):

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

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

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

    всё доступно в справке по команде for
    Код (DOS):

    for /?
     
    Код (DOS):

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

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

    goto end - досрочный выход из цикла (т.е. чтение только первой строки вывода команды).
     
    Kиpилл нравится это.
  3. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    спасибо, вроде потихоньку вникаю... только не совсем понял, откуда у нас во 2 цикле взялись кавычки?
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Какие конкретно?
     
  5. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
     
  6. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Ну в смысле откуда? Сам написал. Вот:

    for /f "tokens=4 delims=/" %%b in ("%%a") do set "url=%%b"
    --- Объединённое сообщение, 28 июн 2016 ---
    А это здесь при чём?
    Это сообщение относится к циклу № 1.
     
  7. alex_diablo
    Оффлайн

    alex_diablo Пользователь

    Сообщения:
    104
    Симпатии:
    7
    все. понял. мы же в 1 цикле получаем ссылку на файл, а она у нас в строке заключена в кавычки.
     
  8. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.478
    Симпатии:
    4.307
    Kиpилл нравится это.

Поделиться этой страницей