Пакет, который устанавливает более новую версию программы

Я использую пакетный файл для автоматической установки разных программ одновременно. Это выглядит так (извлечение):

REM ------------------------------- ALIAS -------------------------------

SET APPS=\\ser-nas\Distribution\APPLICATIONS
SET BUREAU=C:\Users\%username%\Desktop
SET BUREAUPUBLIC=C:\Users\Public\Desktop
SET QUICKLAUNCH=C:\Users\Default\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch

REM ------------------------------ VERSIONS ------------------------------

SET Version_CCleaner=504
SET Version_Firefox=36.0.4
SET Version_FlashPlayer=17x32
SET Version_LibreOffice=4.3.7
SET Version_AdobeReader=11003
SET Version_PDFCreator=2_0_2
SET Version_7Zip=920
SET Version_TightVNC=2.7.10
SET Version_VLC=2.1.5

REM ---------------------------- ARCHITECTURE ----------------------------

Set _Bitness=64
IF %PROCESSOR_ARCHITECTURE% == x86 (
  IF NOT DEFINED PROCESSOR_ARCHITEW6432 Set _Bitness=32
)

REM ---------------------------- INSTALLATION ----------------------------

echo Installation de CCleaner v%Version_CCleaner%...
start /wait %APPS%\System\Cleaners\ccsetup%Version_CCleaner%.exe /S /L=1036

echo Installation de Mozilla Firefox v%Version_Firefox%...
start /wait %APPS%\Internet\"Firefox Setup %Version_Firefox%.exe" -ms

echo Installation de Flash Player v%Version_FlashPlayer% pour Firefox...
start /wait %APPS%\FlashPlayer\17\Firefox\install_flashplayer%Version_FlashPlayer%_mssd_aaa_aih.exe -install

У меня вопрос... Как я могу написать сценарий, который определяет более свежую версию каждой программы, хранящейся в папке, для установки?

До сих пор мне приходилось вручную обновлять номера версий в пакете перед его выполнением. Я хотел бы, чтобы пакет автоматически находил последнюю версию, существующую в определенной папке.

Спасибо за вашу помощь.


person Moskua    schedule 05.05.2015    source источник


Ответы (1)


Следующий скрипт может дать подсказку.

@ECHO OFF >NUL
SETLOCAL enableextensions
SET "APPS=\\ser-nas\Distribution\APPLICATIONS"
SET "APPS=D:\downloads"
call :getVersion Version_Gimp "%APPS%" "gimp-" "-setup-1.exe"
echo debug3 Version_Gimp=%Version_Gimp%
call :getVersion Version_CCleaner "%APPS%\System\Cleaners" "ccsetup" ".exe"
echo debug4 Version_CCleaner=%Version_CCleaner%
call :getVersion Version_Firefox  "%APPS%\Internet" "Firefox Setup " ".exe"
call :getVersion Version_FlashPlayer "%APPS%\FlashPlayer\17\Firefox" "install_flashplayer" "_mssd_aaa_aih.exe"
ENDLOCAL
goto :eof

:getVersion
:: %1 by reference call        example
:: %1 = variable name          Version_FlashPlayer
:: %2 = "setup_folder"         "%APPS%\FlashPlayer\17\Firefox"
:: %3 = "setup_exe_prefix"     "install_flashplayer"
:: %4 = "setup_exe_suffix"     "_mssd_aaa_aih.exe"
::
SETLOCAL enableextensions EnableDelayedExpansion
set "version="
echo debug1 "%~2\%~3*%~4"
FOR /F "delims=" %%G in ('dir /B /O:N "%~2\%~3*%~4" 2^>NUL') do (
    set "version=%%~G"
)
if defined version if not "%~3"=="" set "version=!version:%~3=!"
if defined version if not "%~4"=="" set "version=!version:%~4=!"
)
echo debug2 %1=%version%
ENDLOCAL&set "%1=%version%"&goto :eof

Процедура :getVersion возвращает самую старшую версию с точки зрения /O:N переключателя команды dir (сортировка вывода по имени); может быть недостаточно для конкретной (более сложной) схемы управления версиями...

Вывод:

==>D:\bat\StackOverflow\30046694.bat
debug1 "D:\downloads\gimp-*-setup-1.exe"
debug2 Version_Gimp=2.8.14
debug3 Version_Gimp=2.8.14
debug1 "D:\downloads\System\Cleaners\ccsetup*.exe"
debug2 Version_CCleaner=
debug4 Version_CCleaner=
debug1 "D:\downloads\Internet\Firefox Setup *.exe"
debug2 Version_Firefox=
debug1 "D:\downloads\FlashPlayer\17\Firefox\install_flashplayer*_mssd_aaa_aih.exe"
debug2 Version_FlashPlayer=
person JosefZ    schedule 05.05.2015