@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