2013-09-10 4 views
7

Теперь мне нужно получить подстроку сформировать строку в пакетном файлеКак извлечь подстроку на пакетный файл

Я это

set path="c:\test\branches\9.1\_build" 

мне нужно получить первое значение после значения ветви: 9.1

Но это значение может быть в другом месте, как

c:\xxx\yyyy\zzzz\branches\otherbranch\zzz\uuuu\iii 

В этом случае мне нужно получить это: otherbranch мне нужно одно общее решение, спасибо ребята ..

+0

Да, в .CMD файл –

+1

Рекомендации для отношения к вашему вопросу: Никогда не использовать PATH в качестве собственной переменной. Он зарезервирован для хранения папок, которые нужно искать при поиске команды. Изменение значения может вызвать проблемы позже по линии. – dbenham

+0

Спасибо, человек .. это только пример, но хорошая рекомендация .. –

ответ

16
set "mypath=c:\test\branches\9.1\_build" 
set "value=%mypath:*\branches\=%" 
if "%value%"=="%mypath%" echo "\branches\" not found &goto :eof 
for /f "delims=\" %%a in ("%value%") do set "value=%%~a" 
echo %value% 
+0

Большое спасибо @Endoro U - гений ... –

+2

+1, но вы, вероятно, должны добавить еще один \: 'set" mypath =% mypath: * \ branches \ =% "' – dbenham

+0

@dbenham благодарит, это безопаснее. – Endoro

3

Он использует: раздвоение подпрограмму, которая может быть найдена здесь http://ss64.org/viewtopic.php?id=1687

@echo off 
setlocal 
rem not good idea to overwrite path 
set "_path="c:\test\branches\9.1\_build"" 
call :split %_path% branches 2 part 
call :split %part% \ 2 part2 

echo %part2% 
endlocal 
goto :eof 
:split [%1 - string to be splitted;%2 - split by;%3 - possition to get; %4 - if defined will store the result in variable with same name] 

setlocal EnableDelayedExpansion 

set "string=%~1" 
set "splitter=%~2" 
set /a position=%~3-1 

set LF=^ 


rem ** Two empty lines are required 
echo off 
for %%L in ("!LF!") DO (
    for /f "delims=" %%R in ("!splitter!") do ( 
     set "var=!string:%%R=%%L!" 
     if "!var!" EQU "!string!" (
      echo "!string!" does not contain "!splitter!" >2 
      exit /B 1 
     ) 
    ) 
) 

if !position! equ 0 (set "_skip=") else (set "_skip=skip=%position%") 

for /f "%_skip% delims=" %%P in (""!var!"") DO ( 

    set "part=%%~P" 
    goto :end_for 
) 
:end_for 
if "!part!" equ "" echo Index Out Of Bound >2 &exit /B 2 
endlocal & if "%~4" NEQ "" (set %~4=%part%) else echo %part% 
exit /b 0 
+0

не работает :(это покажи мне эту ошибку. Индекс 'Out Of Bound' –

+0

просто дай мне 5 минут, чтобы проверить его :) – npocmaka

+0

Ok man, I может ждать :) –

3

Вот простое решение, которое использует удобный hybrid JScript/batch utility called REPL.BAT, который выполняет поиск и замену регулярных выражений на stdin и записывает результат в stdout. Это чистый скрипт, который запускается на любой современной машине Windows с XP и дальше - не требуется сторонний исполняемый файл.

У него есть много опций, в том числе опция A, которая содержит только список подстановочных строк, которые соответствуют, и S, который читает из переменной окружения вместо stdin. Полная документация встроена в скрипт.

Предполагая, что REPL.BAT находится в вашем текущем каталоге или, еще лучше, где-то внутри вашего пути, то следующее устанавливает value соответствующим образом. Он будет определен, если \branches\ не может быть найден, или если ничего не следует \branches\:

set "mypath=c:\test\branches\9.1\_build" 
set "value=" 
for /f "eol=\ delims=" %%A in (
    'repl.bat ".*\\branches\\([^\\]*).*" "$1" AS mypath' 
) do set "value=%%A" 
echo %value% 
Смежные вопросы