[CMD] Найти на веб-странице текст href и скачать по ссылке

Ну, скажем не самый подходящий язык для этого. Я бы на C# подобную проверку делал.
Дело в том, что с wget проверка докачан или нет может и не сработать, особенно если файл скачивали какой-то другой программой.

Вот, что я предложу.
Есть перечень кодов всех версий на данный момент (список выше). Можно написать небольшой отдельный скрипт, который скачает по тому списку Вам на шару все смежные продукты.

А отдельный скрипт - тот что Вы описывали ранее - меню с выбором/поиском версии.
 
ну если можно так, то будет очень здорово!

хотя я только что вспомнил... все таки все выкачивать наверное не имеет смысла, т.к. старые версии и вовсе выпускались одним файлом, без отдельных компонентов... так что думаю можно ограничиться лишь 1 страницей. просто в дальнейшем я планирую объединить этот скрипт и предыдущий (который непосредственно устанавливает на компы юнити из этой шары). но пока что нужен отдельный для выкачивания.

зы. а по поводу проверки и докачки - curl не подойдет для этой цели лучше чем wget ?
вроде он умеет это делать?
правда, я им не пользовался ни разу...
 
Последнее редактирование:
Они оба умеют. Просто я wget часто пользовался раньше и знаю, что бывают периодически косяки с докачкой.
Curl чаще обновляется и технологически более продвинутый. Но не факт, что в этой задаче будет справляться лучше по части функции докачивания, да и ключи я сейчас навскидку не скажу какие.
 
Вроде бы реализовал большинство хотелок, в т.ч. докачку.
Разве что перелистывания страниц нет.

Рядом с батником должен находится файл history_url.txt (есть в архиве).

CMD/BATCH:
@echo off
SetLocal EnableExtensions

:: битность сборника
set "bit=UnitySetup64"

:: адрес страницы обновлений
set "UnityURL=https://unity3d.com/ru/unity/qa/patch-releases/"

:: временная папка для скачивания html (не указывайте закрывающий слэш)
set tmpFolder=.

:: папка, куда выкачивать сборник
set "dlFolder=unity"

:: путь к списку версий
set "ver_list=history_url.txt"

:: выводить на экран список из последних N версий (по-умолчанию 10 строк)
set LimitVerCnt=10


:start
cls
echo.
echo Unity3D Downloader
echo.

echo 1. Поиск версии.
echo 2. Выкачать все последние версии.
echo.

set "ch="
set /p "ch=Ваш выбор: "

if "%ch%"=="1" call :SEARCH
if "%ch%"=="2" call :DOWNLOAD
goto start

:: проверка, есть ли в списке указанный URL
:CheckInList [url]
  for /f "UseBackQ delims=" %%a in ("%ver_list%") do if "%%a"=="%~1" exit /B 0
exit /B 1

:SEARCH
call :dl_MainPage
:: этап обновления списка версий
for /f tokens^=2^ delims^=^" %%a in ('type "%tmpFolder%\index.html" ^| find /i "UnitySetup"') do call :CheckInList "%%a" || >> "%ver_list%" echo %%a
:: с учётом битности
< "%ver_list%" > "%ver_list%.tmp" find "%bit%"
:: кол-во строк в списке
for /f "delims=" %%a in ('^< "%ver_list%.tmp" find /v /c ""') do set "nLines=%%a"
:: берем последние N
set /a nLines-=%LimitVerCnt%

set n=%LimitVerCnt%

for /f "delims=" %%a in ('^< "%ver_list%.tmp" more +%nLines%') do (
  for /f "tokens=6 delims=/" %%b in ("%%a") do (
    for /f "tokens=2 delims=-" %%c in ("%%b") do (
      for /f "tokens=4 delims=/" %%d in ("%%a") do (
        call set "URL[%%n%%]=%%a"
        call set "Version[%%n%%]=%%~nc"
        call set "Code[%%n%%]=%%d"
        set /a n-=1
      )
    )
  )
)
:: сортировка версий
> "%ver_list%.tmp" (for /L %%C in (1 1 %LimitVerCnt%) do call echo %%Version[%%C]%%)
< "%ver_list%.tmp" > "%ver_list%.tmp.tmp" sort /R
set n=0
for /f "UseBackQ delims=" %%a in ("%ver_list%.tmp.tmp") do set /a n+=1& call set VersionSort[%%n%%]=%%a
del "%ver_list%.tmp"
del "%ver_list%.tmp.tmp"

:VerList
cls
echo.
echo Список доступных версий:
echo.

for /L %%C in (1 1 %LimitVerCnt%) do call echo %%C.    %%VersionSort[%%C]%%
echo.
set /p "ch=Ваш выбор: "
:: проверка на корректность ввода
if "%ch%"=="" goto VerList
echo.%ch%|findstr /VRC:"^[0123456789][01234567890]*$"&& goto VerList
if %ch% GTR %LimitVerCnt% goto VerList
if %ch% LSS 1 goto VerList

:: маппинг
call set Ver=%%VersionSort[%ch%]%%
For /f "tokens=2* delims=[]=" %%a in ('set Version[') do if "%Ver%"=="%%b" set "map=%%a"
call set URL=%%URL[%map%]%%
call set Code=%%Code[%map%]%%

::echo.
::echo URL=%URL%
::echo Code=%Code%
::echo Ver=%Ver%
echo.
echo Начато скачивание ...
call :dl_bundle "%URL%" "%Code%" "%Ver%"
echo.
echo Все операции завершены
echo.
pause
exit /B

:DOWNLOAD
:: скачивание всех последних сборников
call :dl_MainPage
cls
echo.
echo Список последних версий:
echo.
set n=0
for /f tokens^=2^ delims^=^" %%a in ('type "%tmpFolder%\index.html" ^| find /i "UnitySetup"') do (
  for /f "tokens=6 delims=/" %%b in ("%%a") do (
    for /f "tokens=2 delims=-" %%c in ("%%b") do (
      for /f "tokens=4 delims=/" %%d in ("%%a") do (
        set /a n+=1
        call set "URL[%%n%%]=%%a"
        call set "Version[%%n%%]=%%~nc"
        call set "Code[%%n%%]=%%d"
        echo %%~nc
      )
    )
  )
)
For /L %%+ in (1 1 %n%) do call call :dl_bundle "%%URL[%%+]%%" "%%Code[%%+]%%" "%%Version[%%+]%%"
echo.
echo Все операции завершены
echo.
pause
exit /B

:dl_MainPage
  :: скачивание страницы с последними обновлениями
  echo Ждите ...
  wget -q --force-html -P "%tmpFolder%" -O "index.html" --level=1 --no-cache --retry-connrefused --tries=3 --connect-timeout=5 --no-check-certificate %UnityURL% || (
    echo Не удалось скачать страницу.
    echo Попытка повтора ...
    wget -q --force-html -P "%tmpFolder%" -O "index.html" --level=1 --no-cache --retry-connrefused --tries=3 --connect-timeout=5 --no-check-certificate %UnityURL% || (
      echo Не удалось скачать страницу.
      pause
      exit /B
    )
  )
exit /B

:dl_bundle [URL] [Code] [Ver]
  :: скачивание сборника
  echo.
  echo Скачиванию набор v. %~3
  echo.
  if not exist "%dlFolder%" md "%dlFolder%"
  for %%a in (
    "%~1"
    "http://beta.unity3d.com/download/%~2/TargetSupportInstaller/UnitySetup-Android-Support-for-Editor-%~3.exe"
    "http://beta.unity3d.com/download/%~2/TargetSupportInstaller/UnitySetup-Mac-Support-for-Editor-%~3.exe"
    "http://beta.unity3d.com/download/%~2/TargetSupportInstaller/UnitySetup-iOS-Support-for-Editor-%~3.exe"
    "http://beta.unity3d.com/download/%~2/TargetSupportInstaller/UnitySetup-Windows-Support-for-Editor-%~3.exe"
  ) do (
    if "%%~a" neq "" call :CheckFileSize "%%~a" || wget -P "%dlFolder%" --tries=3 --connect-timeout=5 --retry-connrefused --continue --no-check-certificate "%%~a"
  )
exit /B

:CheckFileSize [URL]
  :: выделяем только имя файла
  for /f "delims=" %%a in ("%~1") do set "FileName=%%~nxa"
  :: существует ли файл в целевом каталоге
  if not exist "%dlFolder%\%FileName%" exit /B 1
  :: если да, сравниваем размер этого файла с реальным на сервере
  :: включаем режим спайдера
  2> "%ver_list%.tmp" wget --spider -P "%dlFolder%.tmp" --tries=3 --connect-timeout=5 --retry-connrefused --no-check-certificate "%~1" || (
    2> "%ver_list%.tmp" wget --spider -P "%dlFolder%.tmp" --tries=3 --connect-timeout=5 --retry-connrefused --no-check-certificate "%~1"
  )
  for /f "tokens=2 delims=: " %%a in ('^< "%ver_list%.tmp" find "Length:"') do set "FileSize=%%a"
  del "%ver_list%.tmp"
  for /f "delims=" %%a in ("%dlFolder%\%FileName%") do if "%%~za"=="%FileSize%" (
    echo [Уже скачан] "%URL%" ^(%FileSize% bytes^)
    exit /B 0
  )
exit /B 1

unity2.png
unity1.png
 

Вложения

  • Downloader.zip
    3.8 KB · Просмотры: 7
Последнее редактирование:
Добавил возможность на этапе 1 указывать номер версии для поиска не только в том списке, что на экране, но и в приложенном файле history_url.txt.
 

Вложения

  • Downloader2.zip
    4 KB · Просмотры: 2
А Вы сделали все так, как я говорил. Текстовик рядом положили?
Отключите @echo off, посмотрите полный листинг команд.
 
вот с последнего архива вроде все норм работает. спасибо! буду тестить.

зы. а можно сделать, чтобы после нажатия цифры пункта меню сразу выполнялось дейстие и не нужно было нажимать enter?
 
Если кол-во пунктов больше 9 (т.е. две цифры) ?
+ во втором меню можно либо вводить номер пункта, либо номер версии.
 
ну в теории, на 1 странице не должно быть больше 9 пунктов... ну и на этот случай тогда уже ввод цифр и подтверждение энтером... а если менее - то сразу.. ну в принципе. ладно. пусть так. вдруг случайно не ту нажмут)
 
Если кол-во пунктов больше 9 (т.е. две цифры) ?
+ во втором меню можно либо вводить номер пункта, либо номер версии.

доброго дня! до сих пор пользовался скриптом, все работает, еще раз спасибо.
но возник вопрос: а откуда мы берем файл history_url.txt ?
т.е. он у нас уже есть заранее. а каким образом можно получить свежий актуальный список всех доступных версий?
может добавить возможность обновления данного списка в код? вернее, не обновление а полную повторную выкачку списка?
 
А зачем вообще нужны эти старые версии?
а откуда мы берем файл history_url.txt ?
Вроде вытягивал ссылки с нескольких последних страниц https://unity3d.com/ru/unity/qa/patch-releases/ с помощью одного из кодов в этом же батнике.
Держи.

CMD/BATCH:
@echo off
SetLocal EnableExtensions

:: битность сборника
set "bit=UnitySetup64"

:: адрес страницы обновлений
set "UnityURL=https://unity3d.com/ru/unity/qa/patch-releases/"

:: временная папка для скачивания html (не указывайте закрывающий слэш)
set tmpFolder=.

:: папка, куда выкачивать сборник
set "dlFolder=unity"

:: путь к списку версий
set "ver_list=history_url.txt"

:: выводить на экран список из последних N версий (по-умолчанию 10 строк)
set LimitVerCnt=10


:start
cls
echo.
echo Unity3D Downloader
echo.

echo 1. Поиск версии.
echo 2. Выкачать все версии.
echo 3. Обновить список версий (файл history_url.txt).
echo.

set "ch="
set /p "ch=Ваш выбор: "

if "%ch%"=="1" call :SEARCH
if "%ch%"=="2" call :DOWNLOAD
if "%ch%"=="3" call :UPDATE_LIST
goto start

:: проверка, есть ли в списке указанный URL
:CheckInList [url]
  for /f "UseBackQ delims=" %%a in ("%ver_list%") do if "%%a"=="%~1" exit /B 0
exit /B 1

:UPDATE_LIST
call :dl_Page "%UnityURL%"
del history_url.txt 2>NUL
for /f tokens^=2^ delims^=^" %%u in ('type "%tmpFolder%\index.html" ^| find /i "?page="') do ( 
  echo "https://unity3d.com%%u"
  call :dl_Page "https://unity3d.com%%u"
  for /f tokens^=2^ delims^=^" %%a in ('type "%tmpFolder%\index.html" ^| findstr /I /C:"UnitySetup32" /C:"UnitySetup64"') do (
    >> history_url.txt echo %%a
  )
)
echo.
echo Завершено.
echo.
pause
exit /b

:SEARCH
call :dl_Page "%UnityURL%"
:: этап обновления списка версий
for /f tokens^=2^ delims^=^" %%a in ('type "%tmpFolder%\index.html" ^| find /i "UnitySetup"') do call :CheckInList "%%a" || >> "%ver_list%" echo %%a
:: с учётом битности
< "%ver_list%" > "%ver_list%.tmp" find "%bit%"
:: кол-во строк в списке
for /f "delims=" %%a in ('^< "%ver_list%.tmp" find /v /c ""') do set "nLines=%%a"
:: берем последние N
set /a nLines-=%LimitVerCnt%

set n=%LimitVerCnt%

for /f "delims=" %%a in ('^< "%ver_list%.tmp" more +%nLines%') do (
  for /f "tokens=6 delims=/" %%b in ("%%a") do (
    for /f "tokens=2 delims=-" %%c in ("%%b") do (
      for /f "tokens=4 delims=/" %%d in ("%%a") do (
        call set "URL[%%n%%]=%%a"
        call set "Version[%%n%%]=%%~nc"
        call set "Code[%%n%%]=%%d"
        set /a n-=1
      )
    )
  )
)
:: сортировка версий
> "%ver_list%.tmp" (for /L %%C in (1 1 %LimitVerCnt%) do call echo %%Version[%%C]%%)
< "%ver_list%.tmp" > "%ver_list%.tmp.tmp" sort /R
set n=0
for /f "UseBackQ delims=" %%a in ("%ver_list%.tmp.tmp") do set /a n+=1& call set VersionSort[%%n%%]=%%a
del "%ver_list%.tmp"
del "%ver_list%.tmp.tmp"

:VerList
cls
echo.
echo Список доступных версий:
echo.

for /L %%C in (1 1 %LimitVerCnt%) do call echo %%C.    %%VersionSort[%%C]%%
echo.
set /p "ch=Ваш выбор: "
:: проверка на корректность ввода
if "%ch%"=="" goto VerList
echo.%ch%|findstr /VRC:"^[0123456789][01234567890]*$"&& goto VerList
if %ch% GTR %LimitVerCnt% goto VerList
if %ch% LSS 1 goto VerList

:: маппинг
call set Ver=%%VersionSort[%ch%]%%
For /f "tokens=2* delims=[]=" %%a in ('set Version[') do if "%Ver%"=="%%b" set "map=%%a"
call set URL=%%URL[%map%]%%
call set Code=%%Code[%map%]%%

::echo.
::echo URL=%URL%
::echo Code=%Code%
::echo Ver=%Ver%
echo.
echo Начато скачивание ...
call :dl_bundle "%URL%" "%Code%" "%Ver%"
echo.
echo Все операции завершены
echo.
pause
exit /B

:DOWNLOAD
:: скачивание всех последних сборников
call :dl_Page "%UnityURL%"
cls
echo.
echo Список последних версий:
echo.
set n=0
for /f tokens^=2^ delims^=^" %%a in ('type "%tmpFolder%\index.html" ^| find /i "UnitySetup"') do (
  for /f "tokens=6 delims=/" %%b in ("%%a") do (
    for /f "tokens=2 delims=-" %%c in ("%%b") do (
      for /f "tokens=4 delims=/" %%d in ("%%a") do (
        set /a n+=1
        call set "URL[%%n%%]=%%a"
        call set "Version[%%n%%]=%%~nc"
        call set "Code[%%n%%]=%%d"
        echo %%~nc
      )
    )
  )
)
For /L %%+ in (1 1 %n%) do call call :dl_bundle "%%URL[%%+]%%" "%%Code[%%+]%%" "%%Version[%%+]%%"
echo.
echo Все операции завершены
echo.
pause
exit /B

:dl_Page [URL]
  :: скачивание страницы
  echo Ждите ...
  wget -q --force-html -P "%tmpFolder%" -O "index.html" --level=1 --no-cache --retry-connrefused --tries=3 --connect-timeout=5 --no-check-certificate %~1 || (
    echo Не удалось скачать страницу.
    echo Попытка повтора ...
    wget -q --force-html -P "%tmpFolder%" -O "index.html" --level=1 --no-cache --retry-connrefused --tries=3 --connect-timeout=5 --no-check-certificate %~1 || (
      echo Не удалось скачать страницу.
      pause
      exit /B
    )
  )
exit /B

:dl_bundle [URL] [Code] [Ver]
  :: скачивание сборника
  echo.
  echo Скачиванию набор v. %~3
  echo.
  if not exist "%dlFolder%" md "%dlFolder%"
  for %%a in (
    "%~1"
    "http://beta.unity3d.com/download/%~2/TargetSupportInstaller/UnitySetup-Android-Support-for-Editor-%~3.exe"
    "http://beta.unity3d.com/download/%~2/TargetSupportInstaller/UnitySetup-Mac-Support-for-Editor-%~3.exe"
    "http://beta.unity3d.com/download/%~2/TargetSupportInstaller/UnitySetup-iOS-Support-for-Editor-%~3.exe"
    "http://beta.unity3d.com/download/%~2/TargetSupportInstaller/UnitySetup-Windows-Support-for-Editor-%~3.exe"
  ) do (
    if "%%~a" neq "" call :CheckFileSize "%%~a" || wget -P "%dlFolder%" --tries=3 --connect-timeout=5 --retry-connrefused --continue --no-check-certificate "%%~a"
  )
exit /B

:CheckFileSize [URL]
  :: выделяем только имя файла
  for /f "delims=" %%a in ("%~1") do set "FileName=%%~nxa"
  :: существует ли файл в целевом каталоге
  if not exist "%dlFolder%\%FileName%" exit /B 1
  :: если да, сравниваем размер этого файла с реальным на сервере
  :: включаем режим спайдера
  2> "%ver_list%.tmp" wget --spider -P "%dlFolder%.tmp" --tries=3 --connect-timeout=5 --retry-connrefused --no-check-certificate "%~1" || (
    2> "%ver_list%.tmp" wget --spider -P "%dlFolder%.tmp" --tries=3 --connect-timeout=5 --retry-connrefused --no-check-certificate "%~1"
  )
  for /f "tokens=2 delims=: " %%a in ('^< "%ver_list%.tmp" find "Length:"') do set "FileSize=%%a"
  del "%ver_list%.tmp"
  for /f "delims=" %%a in ("%dlFolder%\%FileName%") do if "%%~za"=="%FileSize%" (
    echo [Уже скачан] "%URL%" ^(%FileSize% bytes^)
    exit /B 0
  )
exit /B 1
 

Вложения

  • Downloader.zip
    1.6 MB · Просмотры: 1
Назад
Сверху Снизу