Update.bat - Форум
Приветствую Вас Гость | Сегодня: 09.12.2016, Пятница | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум » Total Commander » Total Commander PowerUser » Update.bat (Пакетные файлы обновления софта в сборке.)
Update.bat
lostzombieДата: Пятница, 27.04.2012, 23:36 | Сообщение # 1
Лейтенант
Зареген: 16.12.2011
Всего сообщений: 16
Обсуждаем скрипты обновления и все, что связано с ними.


Методика закачки\обновления большинство ПО схожа, поэтому главное разработать базовый шаблон.

Для примера закачки по прямой ссылке(самый простой случай для начала), выкладываю, скрипт обновления Process Explorer.

Code
@echo off
SETLOCAL enabledelayedexpansion

set name=Process Explorer
set link=http://download.sysinternals.com/files/ProcessExplorer.zip
set fname=ProcessExplorer.zip
set referer=http://technet.microsoft.com/en-us/sysinternals/bb896653
set progname=procexp.exe

if exist "%~dp0log.txt" del /q "%~dp0log.txt"
if exist "%~dp0size_test.txt" move /y "%~dp0size_test.txt" "%~dp0size.txt"

echo %time:~0,-3% Обновление %name%
echo Проверка необходимости обновления...

%~dp0..\..\scripts\aria2c.exe -q --dry-run=true -llog.txt --deferred-input=true --async-dns=false -V -c ^
--allow-overwrite=true --connect-timeout=30 --max-tries=5 --max-file-not-found=5  --retry-wait=5 ^
--user-agent="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0" --check-certificate=false --http-accept-gzip=true ^
--referer=%referer% %link%

set error=!ERRORLEVEL!
if not %error%==0 (
  call %~dp0..\..\scripts\err.bat
  exit /b %error%
) else  (
  type "%~dp0log.txt" | find /i  "Content-Length" >"%~dp0size_test.txt"
  DEL /f /q "%~dp0log.txt"
  if exist "%~dp0size.txt" (
   fc /C /W "%~dp0size_test.txt" "%~dp0size.txt">nul
   if !ERRORLEVEL!==0 (
    del /f /q "%~dp0size_test.txt"
    if not exist "%~dp0%fname%" (
     echo Обновление не требуется
     exit /b 0
    ) else (
       echo Докачка %fname%
       goto :download
      )
   ) else (  
      "%~dp0size_test.txt" move /y "%~dp0size_test.txt" "%~dp0size.txt"
      if exist "%~dp0%fname%" del /f /q "%~dp0%fname%"
  )
  )
  echo Закачка %fname%
  :download
  %~dp0..\..\scripts\aria2c.exe --summary-interval=0 --deferred-input=true --async-dns=false -V -c --always-resume=false --max-resume-failure-tries=5 ^
  --allow-overwrite=true --file-allocation=none --connect-timeout=60 --max-tries=5 --max-file-not-found=5  --retry-wait=5 ^
  --user-agent="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0" --check-certificate=false --http-accept-gzip=true ^
  --referer=%referer% %link%
  set error=!ERRORLEVEL!
  if not %error%==0 (
   call %~dp0..\..\scripts\err.bat
   exit /b %error%
  ) else (  
     if exist %~dp0%fname% (
     echo Распаковка %fname% ...
  call :unpack>nul
  call :filework>nul
     ) else (
        echo Ошибка обновления. Возможно поменялась ссылка на обновление.
        if exist "%~dp0size_test.txt" del /f /q "%~dp0size_test.txt"
        if exist "%~dp0size.txt" del /f /q "%~dp0size.txt"
        exit /b 31
       )
    )
)  
if exist "%~dp0%fname%" del /f /q "%~dp0%fname%"
echo Обновление %name% завершено.
exit /b 0

:unpack
taskkill /f /t /fi "STATUS eq RUNNING" /im %progname%
"%~dp0..\SFX Tool\7z.exe" x "%~dp0%fname%" -y -o"%~dp0"
    if not !ERRORLEVEL!==0 (
     echo Ошибка распаковки.
     exit /b 32
    )
goto :eof    
:filework
del /f /q "%~dp0procexp.chm"
del /f /q "%~dp0Eula.txt"  


для закачки используется aria, ссылки:
http://aria2.sourceforge.net/
http://aria2.sourceforge.net/manual/ru/html/

которая кстати отлично качает с sourceforge.net по ссылкам вида
http://sourceforge.net/projects/xxxxx/files/latest/download,

критика и предложения приветствуются, после обкатки скрипта на его базе можно начинать делать обновления для остального ПО.

Для изменения скрипта под другие программы с прямыми ссылками, достаточно два изменения
1. Вначале раздел с set, заменить ссылки, названия, имена.
2. Изменить процедуры unpack и fileworks в конце.

Вроде бы учел все возможноые ошибки, закачки распаковки, коды завершения 0 - обновления удачно, 1-30 - ошибки закачки, 31 - Если качается что-то не то, ссылка поменялась, 32 - если закачано правильно, но все равно есть ошибки распаковки.

Также учел, если обновляемая программа запущена, процесс убивается, что бы не мешал распаковке.

Присутствует докачка, при непредвиденном завершении скрипта.

кто не в теме aria2c.exe и err.bat положить в папку scripts, Update.bat в папку с Process Explorer.
Прикрепления: err.bat(1Kb) · Update.bat(3Kb)


this game has no name....

Сообщение отредактировал lostzombie - Воскресенье, 29.04.2012, 16:36
Награды: 1
lostzombieДата: Понедельник, 30.04.2012, 00:09 | Сообщение # 2
Лейтенант
Зареген: 16.12.2011
Всего сообщений: 16
пока народ занят подготовкой TCPU69, TCPU69+.
выложу пример скрипта обновления с поиском, ссылки на скачку. Для примера взята AIDA64, повезло что файл ключа pkey.txt подходит для следующих версий.
Code
@echo off
SETLOCAL enabledelayedexpansion

set "name=AIDA64"
set "progname=aida64.exe"
set "downlink=http://www.aida64.com/downloads/a64xe"

if exist "%~dp0log.txt" del /q /f "%~dp0log.txt"
if exist "%~dp0size_test.txt" move /y "%~dp0size_test.txt" "%~dp0size.txt"

echo %time:~0,-3% Обновление %name%

echo Поиск ссылки...

call :findlink>nul
if not "%error%"=="0" (
  echo Ошибка. Ссылка не найдена
  exit /b 32
)
set "link=http://download.aida64.com/%fname%"
echo %link%
set "referer=http://www.aida64.com/downloads/%fname:~0,-4%zip"

echo Проверка необходимости обновления...

"%~dp0..\..\scripts\aria2c.exe" -q --dry-run=true -llog.txt --deferred-input=true --async-dns=false -V -c ^
--allow-overwrite=true --connect-timeout=30 --max-tries=5 --max-file-not-found=5  --retry-wait=5 ^
--user-agent="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0" --check-certificate=false --http-accept-gzip=true ^
--referer=%referer% %link%

set "error=!ERRORLEVEL!"
if not "%error%"=="0" (
  call "%~dp0..\..\scripts\err.bat"
  exit /b %error%
) else  (
  type "%~dp0log.txt" | find /i  "Content-Length" >"%~dp0size_test.txt"
  DEL /f /q "%~dp0log.txt"
  if exist "%~dp0size.txt" (
   fc /C /W "%~dp0size_test.txt" "%~dp0size.txt">nul
   if "!ERRORLEVEL!"=="0" (
    del /f /q "%~dp0size_test.txt"
    if not exist "%~dp0%fname%" (
     echo Обновление не требуется
     exit /b 0
    ) else (
       echo Докачка %fname%
       goto download
      )
   ) else (  
      rem "%~dp0size_test.txt"  
   move /y "%~dp0size_test.txt" "%~dp0size.txt"
      if exist "%~dp0%fname%" del /f /q "%~dp0%fname%"
  )
  )
  echo Закачка %fname%
  :download
  "%~dp0..\..\scripts\aria2c.exe" --summary-interval=0 --deferred-input=true --async-dns=false -V -c --always-resume=false --max-resume-failure-tries=5 ^
  --allow-overwrite=true --file-allocation=none --connect-timeout=60 --max-tries=5 --max-file-not-found=5  --retry-wait=5 ^
  --user-agent="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0" --check-certificate=false --http-accept-gzip=true ^
  --referer=%referer% %link%
  set "error=!ERRORLEVEL!"
  if not "%error%"=="0" (
   call "%~dp0..\..\scripts\err.bat"
   exit /b %error%
  ) else (  
     if exist "%~dp0%fname%" (
     echo Распаковка %fname% ...
  call :unpack>nul
  call :filework>nul
     ) else (
        echo Ошибка обновления. Возможно поменялась ссылка на обновление.
        if exist "%~dp0size_test.txt" del /f /q "%~dp0size_test.txt"
        if exist "%~dp0size.txt" del /f /q "%~dp0size.txt"
        exit /b 31
       )
    )
)  
if exist "%~dp0%fname%" del /f /q "%~dp0%fname%"
echo Обновление %name% завершено.
if not exist "%~dp0pkey.txt" echo Предупреждение! Отсутствует файл лицензии.
exit /b 0

:unpack
taskkill /f /t /fi "STATUS eq RUNNING" /im %progname%
"%~dp0..\SFX Tool\7z.exe" x "%~dp0%fname%" -y -o"%~dp0"
    if not !ERRORLEVEL!==0 (
     echo Ошибка распаковки.
     exit /b 32
    )
goto :eof    
:filework
del /f /q "%~dp0aida64.chm"
del /f /q "%~dp0license.txt"  
copy /y "%~dp0Language\lang_ru.txt" "%~dp0"
rd /s /q "%~dp0Language"
goto :eof   
:findlink
"%~dp0..\..\scripts\aria2c.exe" -q --summary-interval=0 --deferred-input=true --async-dns=false -V -c --always-resume=false --max-resume-failure-tries=5 ^
  --allow-overwrite=true --file-allocation=none --connect-timeout=60 --max-tries=5 --max-file-not-found=5  --retry-wait=5 ^
  --user-agent="Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0" --check-certificate=false --http-accept-gzip=true ^
%downlink%
set "error=!ERRORLEVEL!"
if "!error!"=="0" (
  @findstr "[0-9][0-9][0-9]zip" "%~dp0a64xe"
  for /f "tokens=2 delims= " %%i in ('findstr "[0-9][0-9][0-9]zip" "%~dp0a64xe"') do set "fname=%%i"
  for /f "tokens=3 delims=/" %%i in ("!fname!") do set "fname=%%i"
  set "fname=!fname:~0,-4!.zip"
  del /f /q "%~dp0a64xe"
)
exit /b

основное отличие от примера выше, наличие процедуры findlink, добавлен код завершения 33 - ссылка на обновление не найдена (единственное надо добавить код, если имя файла по маске не найдено на странице обновления).

по прежнему жду коментариев volodia_k и отмашки НАЗАРЕТ, если шаблоны обновлений имеют преимущества над используемыми, то к 60 версии, попробую подготовить скрипты под весь софт.
НАЗАРЕТ, можно сделать lite, версию пака, в которой, по дефолту будет идти только то что нельзя скачать, остальное будет закачиваться, делать цветную иконку, плюс прописыватся в ini, choise editor'a, и других местах где прописано.
Прикрепления: update_from_los.bat(4Kb)


this game has no name....

Сообщение отредактировал lostzombie - Понедельник, 30.04.2012, 02:41
Награды: 1
HA3APETДата: Понедельник, 30.04.2012, 01:11 | Сообщение # 3
Генералиссимус
Зареген: 15.03.2010
Всего сообщений: 693
lostzombie, спасибо за старания и инициативу, посмотрю чуть позже, надо пока допилить 59 сборку.
Награды: 63 Сборщик Total Commander PowerUser и Dr.Web! За 100 Сообщений!За 200 Сообщений!!!За 300 Сообщений!!!За 400 Сообщений!!!За 500 Сообщений!!!
Пользователь из города: Иваново
lostzombieДата: Понедельник, 30.04.2012, 01:15 | Сообщение # 4
Лейтенант
Зареген: 16.12.2011
Всего сообщений: 16
HA3APET, без вопросов, я после создания темы раз десять скрипты допиливал и обновлял, так что время зря не тратим, удачи в обкатке 59ой

this game has no name....
Награды: 1
volodia_kДата: Понедельник, 30.04.2012, 02:09 | Сообщение # 5
Генерал-лейтенант
Зареген: 28.05.2010
Всего сообщений: 387
lostzombie, я там в личку тебе письмо сбросил с пожеланиями... B)
Награды: 15 Сборщик пака дополнительных программ для Total Commander PowerUser! За 100 Сообщений!За 200 Сообщений!!!За 300 Сообщений!!!
Пользователь из города: Almaty
lostzombieДата: Понедельник, 30.04.2012, 02:37 | Сообщение # 6
Лейтенант
Зареген: 16.12.2011
Всего сообщений: 16
volodia_k, чё так скромно, в личку, тему на то и создал, чтобы как минимум знать мнение тебя и назарета, а там ещё кто подпишется :)

про ковычки понял, учтём(поправил выложенный скрипт аиды от греха подальше), в принципе, я на ходу учусь пакетные файлы писать, не так давно, мои знания были ограничены хелпом командной строки :)

процетирую твоё сообщение...
Quote
Теперь по поводу использовании скрипта в сборке.
Если оставить его в этом виде, то будет хлопотно поддерживать, так как он будет находиться в каждой папке с программой. При достаточном их количестве, даже сейчас, это проблематично. Например чтобы чтото поправить, нужно перекопать все папки со скриптом. Да и сам процесс настройки скрипта под прогу нужно упростить.

Короче. У меня предложение к тебе, как разработчику, уже очень неплохого продукта.
1. Сделать один унифицированный скрипт.
2. Он должен находиться например в папке Scripts
3. Файлы !Update.bat, лежащие в прогах, ссылаются на него передовая нужные параметры.

Тоесть в идеале файлик !Update.bat должен содержать пару строк, а все остальное должна делать твоя библиотека.
Если рассматривать то что есть сейчас и вынести это в отдельную библиотеку, то уже можно охватить 50 процентов обновок сборки.
Дальше можно будет уже углубляться в тонкости каждой проги, и делать нужные навесы.

Использование такой библиотеки сильно упростит жизнь разработчику пака.


я об этом думал, но как говорится не лезу вперед батьки в пекло, т.е. для начала, чтобы узнать все нюансы обновления каждой софтины, я всё же навояю !Update.bat, в том виде в котором они представлены выше, т.е. полный код для каждой программы, а при наличии полного набора батников, легче выделить максимально универсальную часть и реализовать мысли описанные тобой. Тем более когда переделываешь под каждую новую программу, обкатываеш базовый скрипт. Так что, если только к 61ой версии :)

к тому же пройдясь по всему софту основной сборки, можно классифицировать его по критерию обновляемости, например:
скачиваемая, но давно не обновляется
постоянная ссылка отсутствует
обновляемая по прямой ссылке, имя файла в ссылке нет, либо неизменно от версии
обновляемая по прямой ссылке, но ссылка зависит от версии
обновляемая но ссылку нужно искать по маске.

аналогично с распаковкой, например аимп даже если скачаеш не распакуеш, нужно либо искать постоянную ссылку на портабл не от разработчика, либо autoit скрипт написать на инсталяцию в папку с тоталом, с подчисткой реестра.


this game has no name....

Сообщение отредактировал lostzombie - Понедельник, 30.04.2012, 02:57
Награды: 1
volodia_kДата: Понедельник, 30.04.2012, 15:58 | Сообщение # 7
Генерал-лейтенант
Зареген: 28.05.2010
Всего сообщений: 387
Quote (lostzombie)
я об этом думал, но как говорится не лезу вперед батьки в пекло, т.е. для начала, чтобы узнать все нюансы обновления каждой софтины, я всё же навояю !Update.bat, в том виде в котором они представлены выше, т.е. полный код для каждой программы, а при наличии полного набора батников, легче выделить максимально универсальную часть и реализовать мысли описанные тобой. Тем более когда переделываешь под каждую новую программу, обкатываеш базовый скрипт. Так что, если только к 61ой версии

Возможно раньше я бы тоже пошел этим путем.
Но так сказать с опытом, могу порекомендовать следующее:
Существующий скрипт вынести в отдельную папку Scripts, как я писал выше.
Модифицировать его под принятие параметров от внешнего вызова текущей программы (под которую он сейчас сделан)
То есть оставить все как есть, только сразу разделить на модуль (в папке Scripts) и вызов модуля с параметрами из !Update.bat, лежащий в папке с прогой.
Это будет главный важный шаг для создания централизованного модуля обновлений. (Он сэкономит тебе массу времени...)
Далее, когда отладишь эту связку под текущую программу, можно будет переходить к другим.
Ищешь проги с похожими запросами на обновки, увеличивая количество обновляемого софта твоей библиотекой.
После уже обрабатываешь исключение из правила, выведенного изначально.
Довес на обработку данного исключения добавит перечень обслуживаемого софта
и т.д.

Лучше сразу идти путем, ведущим к тому что должно быть в итоге.
Иначе потеря времени, сил и мотивации...
Награды: 15 Сборщик пака дополнительных программ для Total Commander PowerUser! За 100 Сообщений!За 200 Сообщений!!!За 300 Сообщений!!!
Пользователь из города: Almaty
lostzombieДата: Понедельник, 30.04.2012, 17:48 | Сообщение # 8
Лейтенант
Зареген: 16.12.2011
Всего сообщений: 16
volodia_k, ну чтож убедил, попробую.

this game has no name....
Награды: 1
gobnait55Дата: Среда, 21.08.2013, 10:06 | Сообщение # 9
Рядовой
Зареген: 21.08.2013
Всего сообщений: 1
Часто меняю наборы колонок и тыкать для этого мышкой просто неудобно а мне схема нравится, привык к ней ещё на4иная со сборок сэмлаб

testking 70-411 testking 70-411
Pass4sure pmi pmp certification Pass4sure pmi pmp certification
Награды: 0
Форум » Total Commander » Total Commander PowerUser » Update.bat (Пакетные файлы обновления софта в сборке.)
Страница 1 из 11
Поиск:

Copyright by Grey © 2016 Хостинг от uCoz

Гость
Мини-Чат