如何在批处理文件中提取子字符串

8
现在我需要从批处理文件中获取字符串的子串。
我有以下内容:
set path="c:\test\branches\9.1\_build"

我需要获取branches值后的第一个值:9.1

但这个值可能出现在其他位置。

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

在这种情况下,我需要获得这个:otherbranch。我需要一种通用的解决方案,谢谢大家。

1
建议与您的问题无关:永远不要使用PATH作为您自己的变量。它被保留用于保存在查找命令时要搜索的文件夹。更改该值可能会在以后引起问题。 - dbenham
谢谢,这只是一个例子,但是很好的建议。 - davdomin
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%

2
+1,但你可能应该再加一个: set "mypath=%mypath:*\branches\=%" - dbenham
4
您可能想加入一个检查来验证'branches'目录是否存在,方法是检查第一个替换结果是否与原始字符串不匹配。 - dbenham

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

请给我5分钟时间来检查它 :) - npocmaka

3
这里有一个简单的解决方案,使用一个方便的混合 JScript/batch 实用工具 REPL.BAT,对 stdin 执行正则表达式搜索和替换,并将结果写入 stdout。它是纯脚本,在任何从 XP 开始的现代 Windows 机器上运行 - 不需要第三方可执行文件。
它有许多选项,包括一个 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%

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接