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

Batch file 如何读取段中的文件名以在批处理脚本中检索一组文件,batch-file,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_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检索所有文件。但它输出所有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_苹果、c1_苹果、c2_苹果、c0_芒果、c1_芒果、c2_芒果等等,就像近15组水果一样)。每组包含4个日志文件(p1、p2、p3、p4)和4个文本文件(p1、p2、p3、p4)。我需要从日志文件中检索平均值,从文本文件中检索速率值,并将它们存储在单独的文件中。(日志文件值和文本文件值可以在同一个输出文件中),因此每个集合(c0_apple有一个输出文件,c1_apple有一个输出文件…)都是如此。我在旧代码中使用以下函数来检索值

`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
    )
    )

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

@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
对于/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
回音\\\\
对于%%b英寸(*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(
回声%%b
)
回音++++
对于%%b英寸(LS-2比特)的操作(
对于%%c in(a0)do(
对于%%d in(C0)do(
对于%%e in(苹果)do(
对于%%n in(p1 p2),对于%%x in(log txt)DO(
如果存在“%%b*%%c*%%d*%%e*%%n.%x”回音(%%b*%%c*%%d*%%e*%%n.%x
)
回音----
对于%%n in(p1 p2),对于%%x in(log txt)DO(
目录/b/a-d“%%b*%%c*%%d*%%e*%%n.%x”
)
回音====
暂停
)
)
)
)
流行音乐
)
回音完成
暂停
后藤:EOF
你想做什么还不太清楚

块语句
(括号内的一系列语句)
不能很好地处理标签,因为标签会终止块

for
循环中使用包含
*
的字符串会将该字符串放入文件名中-要按字面意思使用该字符串,首先需要将其括在引号中,如
“*c0*”
,然后将其分配给元变量
%%X
,然后使用
%%X
将其提取出来

使用固定文本
LS-2bit
a0
c0
apple
等似乎没有什么意义。您没有解释批处理的目的,因此我们开始猜测。也许您可以将其作为一个子程序运行,其中这些元素将作为参数提供(在这种情况下,将每个固定字符串替换为
%~1
%~2


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

编辑:此问题中的原始请求已更改,因此我需要相应地更改我的解决方案。但是,没有发布有关新问题的明确规范,因此我需要猜测将用于开发我的n的规范电子战计划。它们是:

  • 目录中有一组文件的名称格式如下:

    LS-2bit_a0_c#u fruit#p#txt

    LS-2bit_a0_c#u fruit#p#log

其中,
LS-2bit_a0
部分是固定的;
c#
部分随c0、c1和c2而变化;
水果
部分在15种不同的水果组中变化(如“苹果”、“芒果”、“葡萄”等);而p#部分在p1到p4之间变化

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

    速率位######

  • *.log文件各有几行,其中一行的平均值如下:

    Average

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

    RateP1 RateP2 RateP3 RateP4

    AvgeP1 AvgeP2 AvgeP3 AvgeOP4

…其中RateP#是*.txt文件中“bit”后数字的整数部分,AvgeP#是*.log文件中“Average”后的数字;这些值必须用制表符分隔

以下程序符合这些规范:

@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

这是有效的!但我已经更新了我的问题,这也有助于检查是否可以对所有集合进行循环?名称的总变化用于(c0、c1、c2)每个.LS位、a0和p名大约有15个水果名。如果您使用下面的方法,
echo++
,则只需将额外的数据项添加到列表中即可,因此%%d in(C0)的
变成%%d in(C0 C1 C2)的
和%%e in(苹果)的
变成%%e in(apple grape mango)的
这适用于日志文件,但不知何故,文本文件无法检索。“未找到文件”出现错误,我再次检查了目录中是否存在该文件。为我工作得很愉快。请通过编辑将当前代码发布到您的问题中。问题不收费,因此请不要扩展问题-如果需要,请询问其他问题。此外,在您最新发布的代码中,您必须在
do
谢谢。我非常了解它的工作原理。我将尝试此方法并返回。此方法非常好!您是否可以帮助我进行迭代
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