Как определить последнюю папку для сборки приложения на основе имени папки - PullRequest
0 голосов
/ 11 декабря 2018

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

Путь установки основного приложения: C: \ Program Files \ ABC

Подпапки:

  • MiscFolder01
  • MiscFolder02
  • AppName 5.0
  • AppName 5.0.0.0
  • AppName 5.0.1.0
  • AppName 5.0.2.0

Пользователь может иметь любое из «AppName 5». * "папки установлены.Также может быть возможность иметь любую комбинацию папок «AppName 5. *», если более старая сборка не была должным образом удалена перед установкой более поздней сборки.

Поэтому мне нужно определить последнюю установленную сборку на основе имени папки и установить для нее переменную "LATEST_BUILD".

Пример # 1: у пользователя "App Name 5.0", "App"Имя 5.0.0.0 "и" Имя приложения 5.0.2.0 "установлены, но, поскольку" Имя приложения 5.0.2.0 "является последним, мне нужно установить для" Имя приложения 5.0.2.0 "переменную% LATEST_BUILD%

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

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Я бы, вероятно, решил эту задачу, используя следующий код (см. Все пояснительные замечания rem):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=C:\Program Files\ABC" & rem // (root directory)
set "_NAME=AppName"              & rem // (folder name prefix)

rem // Initialise variables:
set /A "HIGHEST=0" & set "LATEST="
rem // Loop through potentionally matching folders:
for /F "delims=| eol=|" %%F in ('dir /B /A:D "%_ROOT%\%_NAME% *"') do (
    rem // Split off last space-separated name portion:
    set "FOLDER=%%F" & set "NUMBER="
    setlocal EnableDelayedExpansion
    for %%H in ("!FOLDER: =" "!") do (if not defined NUMBER endlocal) & set "NUMBER=%%~H"
    rem // Filter for name portions consisting of numerals and dots only:
    setlocal EnableDelayedExpansion
    for /F "tokens=* eol= " %%E in ('echo("!NUMBER!" ^| findstr "\"[0-9\.]*\""') do (
        endlocal
        rem // Extract individual version numbers (four at most):
        for /F "tokens=1-4 delims=. eol=." %%A in ("%%E.0.0.0.0") do (
            rem /* Compute a number out of the individual version numbers;
            rem    note that none of them must have more than two digits: */
            setlocal EnableDelayedExpansion
            set /A "CURRENT=((%%A*100+%%B)*100+%%C)*100+%%D"
            rem // Compare the current number with the stored greatest one:
            if !CURRENT! gtr !HIGHEST! (
                rem // Store the current number as the greatest one in case it is such:
                for /F %%H in ("!CURRENT!") do endlocal & set /A "HIGHEST=%%H"
                rem // Store the folder name correlating with the current number:
                set "LATEST=%%F"
            ) else endlocal
        )
    )
)
rem // Return the resulting folder name:
echo Found folder name: %LATEST%
echo Latest version:    %NUMBER%
echo Comparison number: %HIGHEST%

endlocal
exit /B

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

0 голосов
/ 11 декабря 2018

Простой способ сделать это - использовать цикл FOR вместе с dir /b для получения всех имен папок.Оттуда мы можем использовать базовое выражение «больше чем» для сравнения всех чисел, следующих за BuildFolderName .

Main.Bat

@ECHO OFF
@setlocal enabledelayedexpansion

Rem | Configuration (Directory Path) & (BuildFolderName)
set "InstallPath=C:\Program Files\ABC"
set "BuildFolderName=AppName"
CD %InstallPath%

Rem | Get Folder "AppName*" to String
set "Latest=0"
for /f "tokens=*" %%A in ('dir /b^| find /I "%BuildFolderName%"') do (

    Rem | Extract Numbers From String
    for /f "tokens=1,*" %%B in ('Echo %%A') do (

        Rem | Find Largest Number
        Set "NUM=%%C"
        if !NUM! GTR !MAX! set "Latest=%BuildFolderName% !NUM!"
    )
)

Rem | Here Is The Latest (Largest) File
Echo Your Latest Update Is: %Latest%

pause
goto :EOF

Для получения справки по любой из команд выполните следующие действия:

  • call /?
  • set /?
  • for /?
  • if /?
  • find /?
  • и т. Д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...