如何读取段中的文件名以在批处理脚本中检索一组文件

时间:2016-02-18 07:16:11

标签: batch-file

我在两个不同的目录中有一组以下格式的文件。

LS-2bit_a0_c0_apple_p1.log  
LS-2bit_a0_c0_apple_p1.txt  
LS-2bit_a0_c0_apple_p2.log  
LS-2bit_a0_c0_apple_p2.txt  
LS-2bit_a0_c0_mango_p1.log  
LS-2bit_a0_c0_mango_p1.txt  
LS-2bit_a0_c0_mango_p2.log  
LS-2bit_a0_c0_mango_p2.txt  
LS-2bit_a0_c0_grape_p1.log  
LS-2bit_a0_c0_grape_p1.txt  
LS-2bit_a0_c0_grape_p2.log  
LS-2bit_a0_c0_grape_p2.txt  
LS-2bit_a0_c1_apple_p1.log  
LS-2bit_a0_c1_apple_p1.txt  
LS-2bit_a0_c1_apple_p2.log  
LS-2bit_a0_c1_apple_p2.txt  
LS-2bit_a0_c1_mango_p1.log  
LS-2bit_a0_c1_mango_p1.txt  
LS-2bit_a0_c1_mango_p2.log  
LS-2bit_a0_c1_mango_p2.txt  
LS-2bit_a0_c1_grape_p1.log  
LS-2bit_a0_c1_grape_p1.txt  
LS-2bit_a0_c1_grape_p2.log  
LS-2bit_a0_c1_grape_p2.txt  

,顺序如下:c0,c1,c2等。我想按段读取文件并分别对每组文件执行操作。 (例如,仅使用C0_apple检索所有文件。但是它输出所有苹果文件(例如c0_apple,c1_apple,C2_apple ......)

我是批处理脚本的新手并尝试了以下内容。

@echo off
setlocal enabledelayedexpansion
SET PATH=%PATH%;c:\windows\system32
for /f %%a in ('dir /on /ad /b') do (
    cd %%a
    for %%b in (LS-2bit*) do (
        call :fun1
    )
    :fun1
    for %%b in (*a0*) do (
        call :fun2
    )
    :fun2
    for %%b in (*C0*) do (
        call :fun3
    )
    :fun3
    for %%b in (*apple*) do (
        call :fun4
    )
    for %%b in (*p1.log, *p1.txt, *p2.log *p2.txt) do (
        echo %%b
    )
    cd..
)

很抱歉不太清楚。这正是我需要做的。这是一个庞大的数据集。我需要对每组进行分组(例如,c0_apple_ *,c1_apple,c2_apple,c0_mango,c1_mango,c2_mango等等,就像近15组水果一样)。每组包含4个日志文件(p1,p2,p3,p4)和4个文本文件(p1,p2,p3,p4)。我需要从日志文件中检索平均值并从文本文件中对速率值进行检索并将它们存储在一个单独的文件中。(日志文件值和文本文件值可以在同一个输出文件中)所以每个集合(c0_apple都有一个输出文件, c1_apple有一个输出文件......)。我在旧代码中使用以下函数进行了retreiving值。

`for %%b in (*p1* *p2*) do(

    type %%b | find " bit " >> new1.txt
    )
    for /f "tokens=3" %%d in (new1.txt) do (
    echo %%d > temp.txt
    for /f "delims=." %%r in (temp.txt) do (
    echo | set /p = %%r %tab% >> hmlog.txt
    del temp.txt
    )
    )

and

for %%b in (*p1* *p2*) do(
type %%b | find "Average" >> new.txt
)
for /f "tokens=2" %%b in (new.txt) do (
echo %%b  >> hmtxt.txt
)`

然而,现在的问题是,由于数据量很大,有没有办法循环遍历文件夹以获取每组数据并在每次迭代期间生成输出文件?

2 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
for /f "delims=" %%a in ('dir /on /ad /b "%sourcedir%"') do (
    PUSHD "%sourcedir%\%%a"
    DIR /b /a-d *LS-2bit*a0*c0*apple*p*.log *LS-2bit*a0*c0*apple*p*.txt
    echo \\\\
    for %%b in (*LS-2bit*a0*c0*apple*p1*.log *LS-2bit*a0*c0*apple*p1*.txt
            *LS-2bit*a0*c0*apple*p2*.log *LS-2bit*a0*c0*apple*p2*.txt) do (

     ECHO %%b
    )
    echo ++++
    for %%b in (LS-2bit) do (
     for %%c in (a0) do (
      for %%d in (C0) do (
       for %%e in (apple) do (
        for %%n in (p1 p2) DO FOR %%x IN (log txt) do (
     IF EXIST "%%b*%%c*%%d*%%e*%%n.%%x" ECHO(%%b*%%c*%%d*%%e*%%n.%%x
    )
        echo ----
        for %%n in (p1 p2) DO FOR %%x IN (log txt) do (
     DIR /b /a-d "%%b*%%c*%%d*%%e*%%n.%%x"
    )
        echo ====
    PAUSE
       )
      )
     )
    )
    POPD
)
ECHO done
pause
GOTO :EOF

目前还不清楚你想做什么。

当标签终止块时,块语句(a parenthesised series of statements)与标签不能很好地匹配。

*循环中使用包含?for的字符串使字符串成为文件名 - 要按字面意思使用字符串,您需要先将其括在引号中,如{{ 1}}然后当它被分配给元变量"*c0*"时,使用%%X提取它。

使用固定文字%%~XLS-2bita0c0等似乎没什么意义。您没有解释您的批次的意图做,所以我们猜测领域。也许您可以将其作为子例程运行,其中这些元素将作为参数提供(在这种情况下,用apple%~1替换每个固定字符串等。

以下是生成文件列表的四种不同方法。不知道你更喜欢哪个......

答案 1 :(得分:0)

编辑:此问题中的原始请求已更改,因此我需要相应地更改我的解决方案。但是,没有公布有关新问题的明确规范,因此我需要猜测我将用于开发新程序的规范。他们在这里:

  • 在目录中有一组具有此名称格式的文件:

    LS-2bit_a0_c#_fruit_p#.txt

    LS-2bit_a0_c#_fruit_p#.log

其中LS-2bit_a0部分已修复; c#部分因c0,c1和c2而异; fruit部分超过15种不同的水果组(如“苹果”,“芒果”,“葡萄”等);和p#部分从p1到p4不等。

  • * .txt文件各有几行,其中一行的格式为以下格式:

    Rate bit ###.##

  • * .log文件各有几行,其中一行的格式为平均值:

    Average ###

  • 程序必须将4 * .txt文件中的数据和对应于相同c#_fruit组合的4 * .log文件进行分组,并将它们存储在c#_fruit.out的同一输出文件中名称。每个输出文件必须包含以下两行:

    RateP1 RateP2 RateP3 RateP4

    AvgeP1 AvgeP2 AvgeP3 AvgeOP4

...其中RateP#是* .txt文件中“bit”之后的数字的整数部分,而AvgeP#是* .log文件中“Average”之后的数字;值必须用TAB字符分隔。

以下程序符合这些规范:

@echo off
setlocal EnableDelayedExpansion

rem Group rate data from 4 *.txt files in its corresponding "c#_fruit.out" output file
set "i=0"
set "line="
for /F "tokens=3,4,8 delims=_. " %%a in ('findstr /C:" bit " *.txt') do (
   rem Insert here v a TAB character
   set "line=!line! %%c"
   set /A i+=1
   if !i! equ 4 (
      > %%a_%%b.out echo !line:~1!
      set "i=0"
      set "line="
   )
)

rem Group average data from 4 *.log files in its corresponding "c#_fruit.out" output file
for /F "tokens=3,4,6 delims=_ " %%a in ('findstr "Average" *.log') do (
   rem Insert here v a TAB character
   set "line=!line! %%c"
   set /A i+=1
   if !i! equ 4 (
      >> %%a_%%b.out echo !line:~1!
      set "i=0"
      set "line="
   )
)

输出示例:

C:\> type *.out

c0_apple.out


123     456     789     987
111     222     333     444

c0_mango.out


123     456     789     987
111     222     333     444

c1_apple.out


123     456     789     987
111     222     333     444

c1_mango.out


123     456     789     987
111     222     333     444