Если число подстрок, разделенных -
, является константой пять, в пакетном файле можно использовать следующий код:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_FileName1=abc-cdef-ijklm-2018.04.02-vendor1.1.0.0"
set "_FileName2=abc-cdef-pqrs-2018.03.22-writer1.2.0.0"
set "_FileName3=abc-cdef-lmno-2017.03.22-reader22.5.0.5"
for /F "tokens=1* delims==" %%A in ('set _FileName') do (
for /F "eol=| tokens=5 delims=-" %%C in ("%%B") do (
for /F "eol=| delims=." %%D in ("%%C") do (
echo Last part of "%%B" is: %%D
)
)
)
endlocal
pause
Пожалуйста, игнорируйте самый внешний цикл FOR , используемый здесьтолько для обработки значений неопределенного числа переменных среды, имя которых начинается с _FileName
.
Второй цикл FOR обрабатывает имя файла, назначенное переменной цикла B
вв этом случае путем разбиения его на подстроки (токены) с использованием -
в качестве разделителей, как указано в delims=-
.
Интерес представляет только пятая подстрока.Поэтому tokens=5
указывает, что только пятая подстрока должна быть назначена указанной переменной цикла A
.
Кроме того, символ конца строки изменяется со значения по умолчанию ;
на |
, чтобы избежать начала имени файлас точкой с запятой полностью игнорируется FOR .Имя файла не может иметь вертикальную черту в имени.
Таким образом, второй цикл FOR присваивает переменной цикла C
строки:
vendor1.1.0.0
writer1.2.0.0
reader22.5.0.5
Третий цикл FOR используется для удаления всего после первой точки путем разделения этой строки на подстроки с использованием .
в качестве разделителя с назначением только первой подстроки указанной переменной цикла D
, как по умолчанию с опцией tokens=
не указано явноСнова eol=|
используется, чтобы избежать того, что строка полностью игнорируется FOR , если эта строка начинается с точки с запятой.
Таким образом, переменная цикла D
содержит в этом примере интересующую строкудля дальнейшей обработки, например, просто распечатав ее на консоль.
Вот еще одно решение, использующее только подстановки строк в подпрограмме LastPart
, которые необычно встроены в середину пакетного файла, что медленнее, но работает и для имен файлов с переменнойчисло разделенных дефисом подстрок.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_FileName1=abc-cdef-ijklm-2018.04.02-vendor1.1.0.0"
set "_FileName2=abc-pqrs-2018.03.22-writer1.2.0.0"
set "_FileName3=lmno-2017.03.22-reader22.5.0.5"
goto ProcessFileNames
:LastPart
set "FileName=%~1"
rem Get file name without the last six characters.
set "FileName=%FileName:~0,-6%"
rem Remove from file name in a loop everything from beginning to first hyphen
rem character with removing also the hyphen until this is not possible anymore
rem because of file name string not containing anymore a hyphen.
:LastHyphen
set "LastPart=%FileName:*-=%"
if not "%LastPart%" == "%FileName%" set "FileName=%LastPart%" & goto LastHyphen
echo Last part of %1 is: %LastPart%
rem Exit subroutine LastPart and return to calling FOR command line.
goto :EOF
:ProcessFileNames
for /F "tokens=1* delims==" %%A in ('set _FileName') do call :LastPart "%%B"
endlocal
И, наконец, еще один вариант выше, в котором число символов в конце каждого имени файла также может быть переменной.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_FileName1=abc-cdef-ijklm-2018.04.02-vendor1.1.0.0"
set "_FileName2=abc-pqrs-2018.03.22-writer1.2.0.50"
set "_FileName3=lmno-2017.03.22-reader22.5.10.15"
goto ProcessFileNames
:LastPart
set "FileName=%~1"
rem Remove from file name in a loop everything from beginning to first hyphen
rem character with removing also the hyphen until this is not possible anymore
rem because of file name string not containing anymore a hyphen.
:LastHyphen
set "LastPart=%FileName:*-=%"
if not "%LastPart%" == "%FileName%" set "FileName=%LastPart%" & goto LastHyphen
rem Get string up to first dot from last part of file name.
for /F "eol=| delims=." %%I in ("%LastPart%") do set "LastPart=%%I"
echo Last part of %1 is: %LastPart%
rem Exit subroutine LastPart and return to calling FOR command line.
goto :EOF
:ProcessFileNames
for /F "tokens=1* delims==" %%A in ('set _FileName') do call :LastPart "%%B"
endlocal
Для пониманияиспользуемые команды и как они работают, откройте окно командной строки, выполните там следующие команды и внимательно прочитайте все страницы справки, отображаемые для каждой команды.
call /?
echo /?
endlocal /?
for /?
goto /?
if /?
pause /?
rem /?
set /?
setlocal /?