8

现在我需要从批处理文件中的字符串中获取子字符串

我有这个

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

我需要在分支值之后获得第一个值:9.1

但是这个值可以在其他位置,比如

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

在这种情况下,我需要得到这个:otherbranch 我需要一个通用的解决方案,谢谢你们..

4

3 回答 3

17
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%
于 2013-09-10T19:57:34.963 回答
3

它使用 :split 子程序,可以在这里找到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
于 2013-09-10T19:40:31.583 回答
3

这是一个简单的解决方案,它使用名为 REPL.BAT 的方便的混合 JScript/批处理实用程序,该实用程序在标准输入上执行正则表达式搜索和替换,并将结果写入标准输出。它是从 XP 开始在任何现代 Windows 机器上运行的纯脚本 - 不需要 3rd 方可执行文件。

它有许多选项,包括一个A仅列出匹配的替换行的选项,以及S从环境变量而不是标准输入读取的选项。完整的文档嵌入在脚本中。

假设 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%
于 2013-09-10T20:33:03.040 回答