[Цитировать]

    wadimus
  • 14910
  • Стаж: 7 лет 4 месяца
  • Сообщений: 762
  • Репутация:91

    [+] [-]
Вижу, моим друзьям (я считаю всех пользователей этого сайта своими друзьями) понравились некие технические решения проблемм, связанные с определением ссылок и скачиванием файлов по этим ссылкам.
Продолжу .. написал статейку, просьба покритиковать
большая площадка по размещению бесссплатного софта https://github.com
найти можно практически всё, и скачать это. вот и поговорим о скачивании.
сайт стандартизован, ссылки стандартизованы, получить их довольно легко.
1. Определение файла для скачивания.
для примера возьму одну программу удаленного доступа mRemoteNG
прямая ссылка:
https://github.com/mRemoteNG/mRemoteNG
откроем страницу эту .. в правой стороне страницы есть подсвеченная кнопка Releases (и в кругляшке число - это количество релизов)
перейдем на страницу релизов:
https://github.com/mRemoteNG/mRemoteNG/releases
и это стандартно .. все релизы находятся по одинаковому пути:
https://github.com/<тут_некий_путь>/releases
откроем первую из кнопок Assets (в кругляшке число файлов):
2022.01.07-1.77.2-nb.mRemoteNG-Installer.msi 10.1 MB - это инсталлер
2022.01.07-1.77.2-nb.mRemoteNG.Portable.rar 7.76 MB - это портабель
Source code (zip) - это соурсеры
Source code (tar.gz) - .. мы не программеры, нам это не нуно.
нам нужен портабель, то есть файл с расширением .rar - 2022.01.07-1.77.2-nb.mRemoteNG.Portable.rar
но такое имя неприемлено!
завтра будет уже другое имя, через неделю, год - другое. мы не должны привязываться к числам.
делаем имя скачиваемого файла, допустим такое: nb.mRemoteNG.Portable.rar
2. Утилиты для парсинга.
утилит много, есть стандартная утилита для скачивания wget.exe
но она неудобная, допустим, мы вычислили ссылку, она будет ограничена неудобным для дальнейшей обработки символом "
такие ссылки нужно обрезать слева-справа для избавления символа "
допустим в переменной f - такая необрезанная ссылка, используем команду:
Без первых 1 и последних 1 - set "f=%f:~1,-1%"
для удобства пользования я использую другую утилиту http2cli.exe
https://dzzb.ru/blog/http2cli
чем она примечательна?
во-первых, она выводит в поток ссылки с заменой символа " на +++ - и дальнейший поиск нужного будет легче
во-вторых, некоторые создатели сайтов экономят на символах перевода строки.
в поток будет выводится одна строка, длиной до нескольких сотен, тысяч символов. и попробуй найти в этой огромной строке нужные нам ссылки.
пример:
http2cli <некий сайт> 2 приведет к замене " на +++, но не будет вмешиваться в разрывы строк.
http2cli <некий сайт> 3 приведет к замене " на +++ и создаст разрывы строк между html-тегами.
3. Начальное заполнение переменных.
определим переменные:
set "h1=_начальная_страница1_для_парсинга"
set "w1=_скачиваемый_файл"
set "d1=_поиск_строки_из_начальной_страницы1"
для github.com поисковое выражение такое:
set "d1=download/.*[.]exe"
если ищем .rar - меняем расширение
set "d1=download/.*[.]rar"
разберем строку ..
download/ - ищем все строки в которых есть данное слово
.* - точка - это любой символ, * - много, получается .* - много любых символов
[.] - конкретно символ . - точка
в поисковой строке может быть такое: [0-9] - любое число от 0 до 9, [1-4] - числа 1, 2, 3 или 4
или такое: [^b] - нет символа b
пример, Tor Browser Bundle FTP
https://dist.torproject.org/torbrowser/
поисковое выражение:
set "d1=href.*[0-9][.].[^a-b]"
то есть, ищем релизы без альфа-бета версий (в таких строках нет символов a или b)
итак, начальное заполнение переменных:
set "h1=https://github.com/mRemoteNG/mRemoteNG/releases"
set "d1=download/.*[.]rar"
set "w1=mRemoteNG-Installer.rar"
4. Парсинг.
составляем выражение, один поток перенаправляем через другой поток, полученный результат пишем во временный файл
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
символ | - пайп, перенаправление стандартного потока вывода (stdout) одной программы в стандартный поток ввода (stdin) другой.
"%~dp0http2cli.exe" "%h1%" 2 - первый поток (stdout)
findstr /R /C:"%d1%" - другой поток (stdin)
и такой комбо-поток:
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%")
пишем, перенаправляем (>) во временный файл "%~dp0down.txt"
5. Обработка результатов парсинга.
после парсинга получили временный файл down.txt .. его содержимое:
<a href=+++/mRemoteNG/mRemoteNG/releases/download/2022.01.07-1.77.2-nb/2022.01.07-1.77.2-nb.mRemoteNG.Portable.rar+++ rel=+++nofollow+++ data-skip-pjax>
<a href=+++/mRemoteNG/mRemoteNG/releases/download/v1.77.2-nb/mRemoteNG.24062021NB.rar+++ rel=+++nofollow+++ data-skip-pjax>
<a href=+++/mRemoteNG/mRemoteNG/releases/download/v1.77.2/mRemoteNG.23062021NB.rar+++ rel=+++nofollow+++ data-skip-pjax>
наша цель - первая строка (второе вхождение между символами +++)
для github.com всегда: первая строка такого нашего поиска - наша цель.
/mRemoteNG/mRemoteNG/releases/download/2022.01.07-1.77.2-nb/2022.01.07-1.77.2-nb.mRemoteNG.Portable.rar
читаем файл down.txt построчно и используем первую строку ("%s1%") - если нужна 3-ая строка - то меняем s1 на s3
выделяем 2-ое вхождение
"tokens=2 delims=+++"
и сразу делаем нужную ссылку https://github.com<тут_будет_найденное_выражение>
<"%~dp0down.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do set "s%%a=%%b")
FOR /F "tokens=2 delims=+++" %%a in ("%s1%") do set "g1=https://github.com%%a"
в переменной g1 - наша ссылка
можно определить и версию скачиваемого файла (версию пишем в переменную f)
FOR /F "tokens=7 delims=/" %%a in ("%g1%") do set "f=%%a"
Итог:
получили ссылку на скачиваемый файл (в переменной g1)
куда сохраняем скачиваемый файл (в переменной w1)
версия скачиваемого файла (в переменной f)
6. Скачивание файла (файлов)
.. уф .. устал .. как говорил некий русский президент: я устал, я мухожук ..

[Цитировать]

    wadimus
  • 14910
  • Стаж: 7 лет 4 месяца
  • Сообщений: 762
  • Репутация:91

    [+] [-]
маленькое ЗЫ. Скачивание файла (файлов)
продолжу .. почему во множественном числе: скачивание файла (файлов)?
зачастую, производители разделяют инсталляторы на х86 х64 (а ведь система ячеек и авто-обновление в первую очередь заточена на скачивание инсталляторов)
два инсталлятора, две ссылки, два скачиваемых файла
например WinRar
две запросные ссылки, два скачиваемых файла:
set "h1=http://www.win-rar.com/postdownload.html?&L=4&Version=32bit"
set "h2=http://www.win-rar.com/postdownload.html?&L=4&Version=64bit"
set "w1=winrar-x86.exe"
set "w2=winrar-x64.exe"
одно поисковое выражение для парсинга:
set "d1=winrar-versions"
первое применение комбо-потоковой записи с h1:
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
даст строку в файле down.txt:
<span><a href=+++/fileadmin/winrar-versions/winrar/winrar-x32-611ru.exe+++ class=+++postdownloadlink+++>нажмите здесь</a></span>
второе применение со второй переменной h2 даст строку в файле down.txt:
<span><a href=+++/fileadmin/winrar-versions/winrar/winrar-x64-611ru.exe+++ class=+++postdownloadlink+++>нажмите здесь</a></span>
и опять тут участвует ссылка с числами:
/fileadmin/winrar-versions/winrar/winrar-x32-611ru.exe
так как в файле down.txt одна строка, то построчный разбор этого файла не нужен:
FOR /F "usebackq tokens=2 delims=+++" %%a in ("%~dp0down.txt") do set "g1=https://www.win-rar.com%%a"
в g1 будет прямая ссылка:
set "g1=https://www.win-rar.com/fileadmin/winrar-versions/winrar/winrar-x32-611ru.exe"
соотв. вычисляем и вторую ссылку для х64:
set "g2=https://www.win-rar.com/fileadmin/winrar-versions/winrar/winrar-x64-611ru.exe"
и по этим ссылкам будут скачаны файлы, очищенные от цифр: winrar-x86.exe и winrar-x64.exe
вернемся к непосредственному скачиванию.
6. Скачивание файлов.
Скачивание - процесс долгий и сопряжен со многими проблемами.
во-первых, отсутствие или прерывание тернета в процессе скачивания.
возьмем LibreOffice ver7
set "h1=http://download.documentfoundation.org/libreoffice/stable/"
set "d1=[0-9][.][0-9]"
set "w1=LibreOffice7-x86.msi"
set "w2=LibreOffice7-x86_helppack_ru.msi"
set "w3=LibreOffice7-x64.msi"
set "w4=LibreOffice7-x64_helppack_ru.msi"
ссылка (в переменной h1) одна, там построчно номера версий по возрастанию - то есть последняя строка окажется с самым большим номером - она нам и нужна
применим уже известное комбо:
("%~dp0..\Scripts\http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
в файле down.txt получим:
<!DOCTYPE html PUBLIC +++-//W3C//DTD XHTML 1.0 Transitional//EN+++
<tr><td valign=+++top+++> </td><td><a href=+++7.2.6/+++>7.2.6/</a></td><td align=+++right+++>10-Mar-2022 11:12  </td><td align=+++right+++>  - </td><td> </td></tr>
<tr><td valign=+++top+++> </td><td><a href=+++7.3.2/+++>7.3.2/</a></td><td align=+++right+++>31-Mar-2022 10:40  </td><td align=+++right+++>  - </td><td> </td></tr>
выделяем номер (он самый новый в последней строке):
FOR /F "usebackq tokens=4 delims=+++" %%a in ("%~dp0down.txt") do set "f=%%a"
и чистим его от лишнего символа / (f=7.3.2/)
Без последнего 1 символа : set f=%f:~0,-1%
и этого номера (он будет записан в переменную f) нам достаточно для составления всех ссылок:
set "g1=http://download.documentfoundation.org/libreoffice/stable/%f%/win/x86/LibreOffice_%f%_Win_x86.msi"
set "g2=http://download.documentfoundation.org/libreoffice/stable/%f%/win/x86/LibreOffice_%f%_Win_x86_helppack_ru.msi"
set "g3=http://download.documentfoundation.org/libreoffice/stable/%f%/win/x86_64/LibreOffice_%f%_Win_x64.msi"
set "g4=http://download.documentfoundation.org/libreoffice/stable/%f%/win/x86_64/LibreOffice_%f%_Win_x64_helppack_ru.msi"
по первой и третьей ссылки (g1 и g3) - скачиваемые файлы довольно увесистые (более 330 МБайт)
вопрос: чем такое скачивать?
всем известная утилита wget.exe справится с задачей скачивания, но надо продолжительное время
я раньше скачивал файлы утилитой axel.exe - она визуально красива
давал максимальноге число потоков для скачивания - 8
визуально бежали полоски, которые заполняли строки, очень красиво
но эта утилита увесистая, требует несколько dll-файлов, что неудобно:
msys-2.0.dll
msys-crypto-1.0.0.dll
msys-gcc_s-1.dll
msys-ssl-1.0.0.dll
msys-z.dll
сейчас перестроил систему на использование утилиты aria2c.exe - она однофайловая, ключей просто уйма, тоже может скачивать в несколько потоков
итак, с утилитой для скачивания разобрались - это aria2c.exe
вопрос другой - что делать с повторной скачкой?
что нам мешает еще раз запустить батник для получения готовых инсталляторов - и опять пойдет скачка, повторно! будут перезаписаны уже скачанные файлы.
нужна защита от дурака! зачем скачивать файл из тернета, если этот файл уже есть (и он такой же, что и в тернете)
для этого использую утилиту netsize.exe
https://dzzb.ru/blog/2pomogators
допустим, файл, название которого записано в переменной w1, уже есть:
- вычисляем его размер, если этого файла еще нет - размер равен 0
- вычисляем размер такого же файла, находящегося в тернете, без непосредственного скачивания, ссылка у нас уже есть - она записана в переменной g1
if exist "%~dp0%w1%" ( for %%a in ("%~dp0%w1%") do set "fsize=%%~za" ) else ( set "fsize=0" )
("%~dp0netsize.exe" "%g1%") >"%~dp0down.txt"
Set /p nsize=<"%~dp0down.txt"
netsize.exe выводит в поток число - размер файла, его перенаправляем во временный файл down.txt
и потом читаем этот файл в переменную nsize
признаюсь, выглядит дубово и коряво .. можно сделать более изящно:
for /f "tokens=1" %%i in ('netsize.exe "%g1%"') do set "nsize=%%i"
ну, получилось коряво, зато визуально.
тем более в институте программизЬму обучался слегка, я по специальности инженегр-химик-технолог ВВ (Взрывчатых Веществ)
в переменных fsize и nsize записаны числа - размеры
fsize - размер нашего файла (уже скачанного)
nsize - размер файла с тернета (не скачанного)
далее, если эти переменные равны - то существующий файл равен по размеру с находящимся в тернете. и качать ничего не надо!
переменные отличаются - нужна скачка!
повторю, скачивание - это процесс продолжительный и чреват ошибками.
вдруг, в процессе скачивание пропадет тернет? или сами прервем батник скачивания? мало ли случаев ..
применим защиту от дурака.
будем скачивать не прямой файл, а его копию.
в переменной g1 у нас ссылка, качаем файл (название которого есть в переменной w1)
и качаем файл такой: %~dp0%w1%.~
(то есть качаем не LibreOffice7-x86.msi а LibreOffice7-x86.msi.~)
допустим, файл %~dp0%w1%.~ скачали.
проверяем размер этого файла и сравниваем с размером, полученным из тернета (переменная nsize)
размеры одинаковы - всё ок!
удаляем старый файл (%~dp0%w1%), а временный (%~dp0%w1%.~) переименовываем в новый (%~dp0%w1%) - он будет с тем же названием.
стираем (удаляем) метку неуспешности и идем на метку выход.
размеры разные - произошла ошибка скачивания! бросаем работу.
идем на метку выход.
метка выхода:
стираем наш временный файл down.txt и временный (недокачанный) файл %~dp0%w1%.~ (возможно его и нет)
del "%~dp0down.txt" /q
del "%~dp0*.~" /q
как определить, скачалась ли новая версия инсталлятора или скачивание не произошло (ибо в тернете та же версия) или скачивание прервалось из-за ошибки?
ввел понятие успешности батника скачивания.
скачивание идет в некой ячейке (папке), в которой есть:
- информационные потоки (название программы, версия, описание, характеристики инсталлятора - можно ли его скачать и/или тихо установить, тегирование ячейки и прочие характеристики)
- есть два (три) батника воздействия на эту ячейку - обновление, установка
- и возможно, есть некий файл неуспешности.
ячейка успешная - в ней есть инсталлятор (инсталляторы), который можно установить. и при скачивании новых версий инсталляторов всё ок! файлы, возможно, скачались, или не скачались.
ячейка неуспешная - в ней так же есть инсталлятор (инсталляторы), который можно установить. но при скачивании новой версии инсталлятора произошла ошибка.
что делать с неуспешной ячейкой? проверить наличие тернета, попробовать заново работу батника скачивания и не прекращать работу этого батника.
повторю - метка неуспешности - в тернете есть новая версия инсталлятора, и этот инсталлятор не скачан.
метка успешности - это файл alarm.txt.
в начале определения переменных и до начала скачивания в этот файл записываем один символ:
echo.?> "%~dp0alarm.txt"
затем идет уже определение переменных и скачивание
скачали и нет ошибок - файл удаляется. выход.
произошла ошибка - файл alarm.txt остается. выход.
ЗЫ. повторю .. содержимое батников корявое, можно было и изящнее.
зато есть шаблон батника скачивания, создать новую ячейку по такому шаблону легко и понятно.
тем более, идею с ячейкой продумал лет 5 назад, сьел не одного барбоса и выпил пива, вотки и своей крови достаточно.
ЗЗЫ. слово тернет - услышал от одного друга лет 20 назад. он всё допытывался у меня: - а что такое тернет? научи меня тернету!
вот и прилипло сеё слово. оно сочное.

[Цитировать]

    wadimus
  • 14910
  • Стаж: 7 лет 4 месяца
  • Сообщений: 762
  • Репутация:91

    [+] [-]
друг avalat подкинул идею .. вычисление ссылок новомодных Ms.NET-ов
вот, оформил сию свою писанину в статеечку.
Получение ссылок Ms.NET 5.0-6.0-7.0
официальные однотипные ссылки:
https://dotnet.microsoft.com/en-us/download/dotnet/5.0
https://dotnet.microsoft.com/en-us/download/dotnet/6.0
https://dotnet.microsoft.com/en-us/download/dotnet/7.0
сюда же добавим и версию 3.1
https://dotnet.microsoft.com/en-us/download/dotnet/3.1
откроем одну из них, к примеру для 6-ой версии
https://dotnet.microsoft.com/en-us/download/dotnet/6.0
5-ая 7-ая и 3.1-ая версии совершенной идентичны, поэтому разбираемся с 6-ой версией, получаем ссылки для этой версии и результат экстраполируем на остальные версии
Итаке, видим четыре пары ссылок
почему пара?
ссылки в строке (нас интересуют х86 и х64):
Windows  Arm64 | x64 | x86
или в строке:
Windows  Hosting Bundle | x64 | x86
почему четыре?
заголовки:
SDK 6.0.202
ASP.NET Core Runtime 6.0.4
.NET Desktop Runtime 6.0.4
.NET Runtime 6.0.4

номера версий нам неизвестны.
о х86 забываем, и рассматриваем ссылки для х64.
нажав мышкой ссылку в строке (нажимаем на х64):
Windows  Arm64 | x64 | x86
попадаем на некую страницу
https://dotnet.microsoft.com/en-us/download/dotnet/...ws-x64-installer
после чего принудительно нам предлагают скачать готовый инсталлятор
в нашем батнике нам ничего не предложат, будем рассчитывать только на свои умения.
Приведу уже готовые батники и откомменчю их:
SDK
:: вместо 6 можно поставить 5 или 7
set "num=6"
:: установим начальную страницу и поисковое выражение
set "h1=https://dotnet.microsoft.com/en-us/download/dotnet/%num%.0"
set "d1=SDK %num%[.]"
:: применяю известное комбо
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
:: и тут же проверю результаты поиска - если временный файл down.txt имеет размер 0 - ничего не скачалось, нет тернета, на метку 1
for %%a in ("%~dp0down.txt") do set size=%%~za
if %size%==0 goto 1
:: первая строка имеет в составе самый большой номер (6.0.202), далее в строках номера уменьшаются
:: используем первую строку, выделяем 2-ое вхождение между +++
<"%~dp0down.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do set "s%%a=%%b")
FOR /F "tokens=2 delims=+++" %%a in ("%s1%") do set "f=%%a"
:: в переменную f будет записано значение: sdk-6.0.202
:: избавляемся от 4-х символов вначале
set "f=%f:~4%"
:: получаем голый номер f=6.0.202
:: и составляем окончательную ссылку на страницу, в которой будем искать ехе-файл (х64)
:: ищем [.]exe - точка ехе
set "h1=https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/sdk-%f%-windows-x64-installer"
set "d1=[.]exe"
:: наше комбо
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
:: проверяем правильность скачивания
for %%a in ("%~dp0down.txt") do set size=%%~za
if %size%==0 goto 1
:: в файле down.txt строк много, они идентичные, поэтому используем самую последнюю, без построчного разбора
FOR /F "usebackq tokens=2 delims=+++" %%a in ("%~dp0down.txt") do set "g1=%%a"
:: в переменной g1 - наша прямая ссылка
:: она имеет такой вид:
:: https://download.visualstudio.microsoft.com/download/pr/e4f4bbac-5660-45a9-8316-0ffc10765179/8ade57de09ce7f12d6411ed664f74eca/dotnet-sdk-6.0.202-win-x64.exe
:: метка выхода, стираем временный файл down.txt и выходим
:1
del "%~dp0down1.txt" /q
Exit /B
ASP.NET Core Runtime
set "num=6"
:: та же самая страница
set "h1=https://dotnet.microsoft.com/en-us/download/dotnet/%num%.0"
:: но на ней ищем другое
set "d1=ASP.NET Core Runtime %num%[.]"
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
for %%a in ("%~dp0down.txt") do set size=%%~za
if %size%==0 goto 1
<"%~dp0down.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do set "s%%a=%%b")
:: во временном файле down.txt нам нужна первая строка, выделяем 3-е вхождение между разделителями > и <
FOR /F "tokens=3 delims=><" %%a in ("%s1%") do set "f1=%%a"
:: получили много-словное выражение: ASP.NET Core Runtime 6.0.4
:: нам нужен только номер - это 4-ое вхождение между пробелами
FOR /F "tokens=4 delims= " %%a in ("%f1%") do set "f=%%a"
:: составляем окончательную ссылку, где будем искать ехе-файл
set "h1=https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-aspnetcore-%f%-windows-x64-installer"
set "d1=[.]exe"
:: комбо с проверкой правильности скачивания
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
for %%a in ("%~dp0down.txt") do set size=%%~za
if %size%==0 goto 1
:: в файле down.txt строк много, они одинаковы, используем последнее
FOR /F "usebackq tokens=2 delims=+++" %%a in ("%~dp0down.txt") do set "g1=%%a"
:: в переменной g1 - наша прямая ссылка
:1
del "%~dp0down1.txt" /q
Exit /B
.NET Desktop Runtime
set "num=6"
set "h1=https://dotnet.microsoft.com/en-us/download/dotnet/%num%.0"
set "d1=NET Desktop Runtime %num%[.]"
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
for %%a in ("%~dp0down.txt") do set size=%%~za
if %size%==0 goto 1
<"%~dp0down.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do set "s%%a=%%b")
FOR /F "tokens=3 delims=><" %%a in ("%s1%") do set "f1=%%a"
:: получили много-словное выражение: .NET Desktop Runtime 6.0.4
:: нам нужен только номер - это 4-ое вхождение между пробелами
FOR /F "tokens=4 delims= " %%a in ("%f1%") do set "f=%%a"
set "h1=https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-%f%-windows-x64-installer"
set "d1=[.]exe"
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
for %%a in ("%~dp0down.txt") do set size=%%~za
if %size%==0 goto 1
FOR /F "usebackq tokens=2 delims=+++" %%a in ("%~dp0down.txt") do set "g1=%%a"
:1
del "%~dp0down1.txt" /q
Exit /B
.NET Runtime
set "num=6"
set "h1=https://dotnet.microsoft.com/en-us/download/dotnet/%num%.0"
set "d1=NET Runtime %num%[.]"
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
for %%a in ("%~dp0down.txt") do set size=%%~za
if %size%==0 goto 1
<"%~dp0down.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do set "s%%a=%%b")
FOR /F "tokens=3 delims=><" %%a in ("%s1%") do set "f1=%%a"
:: получили много-словное выражение: .NET Runtime 6.0.4
:: нам нужен только номер - это 3-ое вхождение между пробелами
FOR /F "tokens=3 delims= " %%a in ("%f1%") do set "f=%%a"
set "h1=https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-%f%-windows-x64-installer"
set "d1=[.]exe"
("%~dp0http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
for %%a in ("%~dp0down.txt") do set size=%%~za
if %size%==0 goto 1
FOR /F "usebackq tokens=2 delims=+++" %%a in ("%~dp0down.txt") do set "g1=%%a"
:1
del "%~dp0down1.txt" /q
Exit /B
c 7-ой версией номер будет таким:
7.0.100-preview.3
он так и будет участвовать в ссылках:
https://dotnet.microsoft.com/en-us/download/dotnet/...ws-x64-installer
https://dotnet.microsoft.com/en-us/download/dotnet/...ws-x64-installer
https://dotnet.microsoft.com/en-us/download/dotnet/...ws-x64-installer
https://dotnet.microsoft.com/en-us/download/dotnet/...ws-x64-installer
для версии 3.1 (а почему бы и нет?) используем конкретное число:
set "h1=https://dotnet.microsoft.com/en-us/download/dotnet/3.1"
set "d1=SDK 3.1"
или
set "d1=ASP.NET Core Runtime 3.1"
или
set "d1=NET Desktop Runtime 3.1"
или
set "d1=NET Runtime 3.1"
результат этих батников один - в переменной g1 - прямые ссылки на получение инсталлятора х64, качаем файл по этой прямой ссылке

[Цитировать]

    wert
  • 23213
  • Стаж: 4 года 3 месяца
  • Сообщений: 87
  • Репутация:2

    [+] [-]
wadimus, aa az а нот пад трудно сделать обновлятор блин 3дня впустубю
Добавлено через 34 секунды:
не как не получается

[Цитировать]

    wadimus
  • 14910
  • Стаж: 7 лет 4 месяца
  • Сообщений: 762
  • Репутация:91

    [+] [-]
set "h1=https://github.com/notepad-plus-plus/notepad-plus-plus/releases"
set "d1=download/.*[.]exe"
set "w1=npp.Installer-x86.exe"
set "w2=npp.Installer-x64.exe"
:: парсинг ссылки h1 поисковое слово d1 -результат пишем в файл down.txt
("%~dp0..\Scripts\http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
:: ничего не скачалось - нет тернета, на выход
for %%a in ("%~dp0down.txt") do set size=%%~za
if %size%==0 goto 1
:: в файле down.txt интересуют 3-ая и 5-ая строки - соотв. для х86 и х64 инсталляторы
:: вычисляем ссылки и тут же их оформляем в g1 и g2 - для х86 и х64 - прямые ссылки
<"%~dp0down.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do set "s%%a=%%b")
FOR /F "tokens=2 delims=+++" %%a in ("%s3%") do set "g1=https://github.com%%a"
FOR /F "tokens=2 delims=+++" %%a in ("%s5%") do set "g2=https://github.com%%a"
:: и заодно вычисляем версию из х86 ссылки - в f
FOR /F "tokens=7 delims=/" %%a in ("%g1%") do set "f=%%a"
:: избавляемся от v
set f=%f:*v=%
ссылки вычислены, качаем из g1 - файл w1 и качаем из g2 - файл w2
ЗЫ. на 15.05.22 качается версия 8.4.1.0

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
"%~dp0..\Scripts\http2cli.exe" "%h1%" 2| >"%~dp0down.txt" findstr /R /C:"%d1%"|| goto 1

[Цитировать]

    wadimus
  • 14910
  • Стаж: 7 лет 4 месяца
  • Сообщений: 762
  • Репутация:91

    [+] [-]
Ander_73,
можно и так .. можно обойтись без временного файла.
оптимизацию не делал ..
сама идея авто-обновления была сделана лет 7-8-9 назад, давно это было ..
составил некий шаблон, теперь подбор и создание новой ячейки - это дело нескольких минут.
конечно, оптимизация этого шаблона нужна, но, болею страшной заразной болезнью - это лень af
тем более - главная заповедь программера: работает - не трогай!

[Цитировать]

    dimo70
  • 17296
  • Стаж: 6 лет 3 месяца
  • Сообщений: 3990
  • Репутация:26

    [+] [-]
  • Откуда: BG
работает - не трогай!
ay
Я же делал по скрипта wadimus недавно репак. Notepad_Online.exe
Проверял, работает нормально.

_________________
Подпись отключена за нарушение правил форума

[Цитировать]

    Ander_73
  • 15549
  • Стаж: 7 лет 1 месяц
  • Сообщений: 3586
  • Репутация:127

    [+] [-]
wadimus, aa
Просто Сергея, например, интересуют мои замечания по оптимизации бат-ников. Тебя, вижу, наоборот. Учту. bf

[Цитировать]

    dimo70
  • 17296
  • Стаж: 6 лет 3 месяца
  • Сообщений: 3990
  • Репутация:26

    [+] [-]
  • Откуда: BG
Ander_73, твои замечания по оптимизации не могут не заинтересовать любого.
Я уверен что и wadimus это понимает, просто не хочет сейчас заниматься этим. Я попробую изменить в связи с рекомендации мой репак.
PS: Обновил код. Notepad++_Online - скачивает автоматом новейсшая версия программы, после чего устанавливает в зависимость от разрядности, показывает номер версии. Все это одним кликом.

_________________
Подпись отключена за нарушение правил форума

[Цитировать]

    wadimus
  • 14910
  • Стаж: 7 лет 4 месяца
  • Сообщений: 762
  • Репутация:91

    [+] [-]
Ander_73,
друг, твой код изящнее и практичнее ..
почему я не переделываю свои батники (как в твоём коде) - их (батников) очень много! много - значит, их сотни!
и каждый надо проверить и убедиться в правильности ..
когда я делал шаблон, я пробовал десятки вариантов, зачастую изящный вариант не проходил из-за не-визуальности.
вот код, покажи его другому человеку - он должен понять его ..
а тут, через пару лет, свой же код не могу понять, неужели это я делал?
поэтому код корявый .. зато визуальный. производим парсинг и копаемся потом в результате для создания прямых (кривых) ссылок.
ссылка не ловится (почему? а программеры офсайта иногда переделывают их) - пробуем другие теги или слова для поиска.
ЗЫ. надеюсь, ты понял меня.

Добавлено через 1 час 21 минута 22 секунды:
продолжу ..
вот, новая мозилла ..
прямые ссылки (я их называю по запросу)
set "g1=https://download.mozilla.org/?product=firefox-latest-ssl&os=win&lang=ru"
set "g2=https://download.mozilla.org/?product=firefox-latest-ssl&os=win64&lang=ru"
и что качаем по этим ссылкам
set "w1=Firefox-Setup-x86.exe"
set "w2=Firefox-Setup-x64.exe"
а как определить версию скачанного?
определяемая версия (шаблон) дает 2 результата (некие батники):
v.bat : 18.5.0.0
n.bat : 18.05
явно, версия не такая ..
как решаю вопрос с версией:
новая переменная:
set "w3=setup.exe"
- распаковываю полученный инсталлятор (файл Firefox-Setup-x86.exe)
- и вычисляю версию этого файла (setup.exe) стандартной мелкософтовской утилитой (filever.exe)
- утилита (filever.exe) пишет в поток, его перехватываю во временный файл (down.txt)
- далее анализирую файл, вычисляю версию, пишу версию в переменную f
- после чего удаляю распакованный временный файл (setup.exe)
"%~dp0..\Scripts\7z.exe" e "%~dp0%w1%" -y -o"%~dp0" "%w3%"
("%~dp0..\Scripts\filever.exe" /A /D /V "%~dp0%w3%" | findstr /R /C:"ProductVersion") >"%~dp0down.txt"
FOR /F "usebackq tokens=2" %%a in ("%~dp0down.txt") do set f=%%a
del "%~dp0%w3%" /q

[Цитировать]

    dimo70
  • 17296
  • Стаж: 6 лет 3 месяца
  • Сообщений: 3990
  • Репутация:26

    [+] [-]
  • Откуда: BG
wadimus, вроде у тебя были самообновляющие батники на foobar2000. Можешь выложить ссылку?
И еще если собрал побольше софта, дай ссылку на все переброшу в твою папку на FTP.

_________________
Подпись отключена за нарушение правил форума

[Цитировать]

    wadimus
  • 14910
  • Стаж: 7 лет 4 месяца
  • Сообщений: 762
  • Репутация:91

    [+] [-]
dimo70, хм ..
офсайт, что ищем, куда качаем
set "h1=http://www.foobar2000.org/download"
set "d1=[.]exe"
set "w1=foobar2000.exe"
парсинг
("%~dp0..\Scripts\http2cli.exe" "%h1%" 2| findstr /R /C:"%d1%") >"%~dp0down.txt"
в файле down.txt строка
Download <a href=+++/getfile/foobar2000_v1.6.11.exe+++>foobar2000 v1.6.11</a><br/>
второе вхождение между символами +++
<"%~dp0down.txt" (for /f "tokens=1* delims=[]" %%a in ('find /n /v ""') do set "s%%a=%%b")
FOR /F "tokens=2 delims=+++" %%a in ("%s1%") do set "f=%%a"
и делаем финт ушами .. в переменной f записана строка:
/getfile/foobar2000_v1.6.11.exe
получаем некого барбоса с нужным нам хвостом, отрываем от него хвост, барбоса выкидываем, хвост приставляем к другому (к котейке)
и делаем прямую ссылку в переменной g1
set f=%f:*getfile/=%
set "g1=http://www.foobar2000.org/files/%f%"
ЗЫ. Ander_73 вопрос к тебе ..
опять тут присутствует некий временный файл down.txt (а он у меня один всегда - имя одинаковое)
можно ли без него обойтись?
возможно, да!
но пропадет некая визуальность действий .. получили запись потока в этот файл, остановливаем наш батник, анализируем, что в этом временном файле записано, вычисляем дальнейший шаг, обрезка концов, вычисление ссылок.
а если переделать мои много-строчные вычисление прямой ссылки (анализ потока без записи этого потока во временный файл, потом ограничение тегами , потом обрезка лишнего и в конце создание прямой ссылки) как некую волшебную строку (одну!) в батнике - пропадает понимание простым юзером тактики вычисления!
даже и сам после полгода, года .. или большего времени непогружения в код - вопрос будет один: - а кто это сделал? неужели я? какой я умный! az а оно будет работать? .. что-то я отупел

[Цитировать]

    wert
  • 23213
  • Стаж: 4 года 3 месяца
  • Сообщений: 87
  • Репутация:2

    [+] [-]
95055
Ander_73, твои замечания по оптимизации не могут не заинтересовать любого.
Я уверен что и wadimus это понимает, просто не хочет сейчас заниматься этим. Я попробую изменить в связи с рекомендации мой репак.
PS: Обновил код. Notepad++_Online - скачивает автоматом новейсшая версия программы, после чего устанавливает в зависимость от разрядности, показывает номер версии. Все это одним кликом.
Добавлено через 1 минута 12 секунд:
у мня не работает тоесть не скачивает

[Цитировать]

    dimo70
  • 17296
  • Стаж: 6 лет 3 месяца
  • Сообщений: 3990
  • Репутация:26

    [+] [-]
  • Откуда: BG
wadimus, спасибо большое! Сработало. ay az
Foobar2000_Online
Добавлено через 3 минуты 32 секунды:
wert, давай больше подробности. ОС какая? Ошибки какие? У меня Win1064 работает замечательно.
Notepad++_Online
ЗЯ Кажеться понял в чем проблема... Исправил.

_________________
Подпись отключена за нарушение правил форума

Страница 15 из 27


Показать сообщения:    

Текущее время: 29-Мар 11:15

Часовой пояс: UTC + 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы