如何从文件名列表中获取子串

时间:2011-09-15 19:06:39

标签: batch-file

我想开发以下逻辑

  1. 读取目录中的所有文件
  2. 提取文件名的第一部分 - 这将是合作伙伴名称
  3. 在第一个下划线后提取任何内容 - 这将是文件名
  4. 例如:ZZTEST_123_abc_doc.txtZZTEST是合作伙伴。 123_abc_doc.txt是文件名。
  5. 以下是我开发的代码

    @echo off
    setlocal ENABLEDELAYEDEXPANSION
    Set Test_Dir=C:\Axway\projects\Cardinal\dosscript\test
    cd %Test_Dir%
    
    for /r %%a in (*.*) do (
    
         Set "fname1=%%~nxa"
         echo Filename is :!fname1!
    
        for /f "tokens=1 delims=_" %%i in ("!fname1!") do (
        Set "partner=%%i"
        echo Partner is :!partner!
        Set "str_tmp=!partner!_"
        echo !str_tmp!
    
    
        call :strlength length !str_tmp!
        echo !length!
    
        set fname=!fname1:~%length%!
        echo !fname1:~%length%!
    
        )
    
    )
    goto :eof
    
    :strlength
    setlocal enableextensions
    set "#=%~2"
    set length=0
    :stringLengthLoop
    if defined # (set "#=%#:~1%"&set /A length+=1&goto stringLengthLoop)
    endlocal && set "%~1=%length%"
    GOTO :EOF
    

    但结果是

    ID_ZZRoutingID_filename.txt
    Filename is :ZZRoutingID_ZZRoutingID_filename1.txt
    Partner is :ZZRoutingID
    12
    Result: ID_ZZRoutingID_filename1.txt
    

    结果应该是ZZRoutingID_filename1.txt,但我得到了 ID_ZZRoutingID_filename1.txt。

    请帮忙

1 个答案:

答案 0 :(得分:1)

我不清楚长度计算的目的,但我建议您在1 for /f "tokens=1 delims=_"之后添加一个星号。然后,您将通过%%j获取您要查找的“文件名”。

我测试了这样:

@echo off
setlocal EnableDelayedExpansion

set source=D:\Program Files\Somewhere
cd %source%

for /r %%i in (*.*) do (
  for /f "tokens=1* delims=_" %%j in ( "%%~nxi" ) do (
    echo partner: %%j
    echo name: %%k
  )
)

endlocal

如果您不需要通过子目录递归:

@echo off
set source=D:\Program Files\Somewhere

for /f "tokens=1* delims=_" %%i in ( 'dir "%source%" /b /a-d' ) do (
    echo partner: %%i
    echo filename: %%j
)

dir /b /a-d检索目录内容的列表,但子目录除外:

D:\Program Files\Somewhere>dir /b /a-d
ZZTEST_123_456.txt
ABCDEF_890_FFF.doc
FOOBAR_567_@@@.zzz