Batch file 解析文件夹中多个文本文件中的特定字符串(2个字符串)

Batch file 解析文件夹中多个文本文件中的特定字符串(2个字符串),batch-file,Batch File,我正在尝试解析以以下内容开头的多行: 另外,我想忽略SH Library Procedure=$(Stem)\u test,它在.txt文件中有相同的单词Procedure。 我想搜索所有*.txt文件并在输出文件中累积日期,我将使用该文件在req管理工具中上载 以下是该文件的示例: 我尝试了下面的代码,但它没有以特定格式打印过程 @echo off ( for /f "tokens=1,*" %%a in ('find "Procedure =" ^< "TEST.txt"')

我正在尝试解析以以下内容开头的多行:

另外,我想忽略
SH Library Procedure=$(Stem)\u test
,它在.txt文件中有相同的单词
Procedure
。 我想搜索所有*.txt文件并在输出文件中累积日期,我将使用该文件在req管理工具中上载

以下是该文件的示例:

我尝试了下面的代码,但它没有以特定格式打印
过程

@echo off
(
    for /f "tokens=1,*" %%a in ('find "Procedure =" ^< "TEST.txt"') do (
        for /f "tokens=1,*" %%d in ('find "Description =" ^< "TEST.txt"') do (
            for /f "tokens=1,2 delims=#" %%c in ("%%b") do (
                echo(Procedure %%~nxc
                echo(
                echo(Procedure %%a
                echo(
                echo(Description %%d
                echo(
                echo(Path: %%~pb
                echo(
        )
    )
)>"output file.txt"
pause

好的,这个应该可以,但我现在不能测试

@(
  ECHO OFF
  SETLOCAL EnableDelayedExpansion
  SET "_FilePath=C:\Admin"
  SET "_FileGlob=*.txt"
  SET "_MatchRegex1=Procedure =.*::.*$"
  SET "_MatchRegex2=Description = .*::.*$"
  SET "_ExcludeRegex=^SH Library Procedure =.*$"
  SET "_OutputFile=%Temp%\output file.txt"
)

FOR /F "Tokens=*" %%A IN ('
  DIR /A-D /S /B "%_FilePath%\%_FileGlob%"
') DO (
  SET "_FileName=%%~nxA"
  SET "_CurrentFile=!_FileName: =_!"
  FOR /F "Tokens=1*" %%a IN ('
    FindStr /I /R
    /C:"%_MatchRegex1%"
    /C:"%_MatchRegex2%"
    "%%A"
    ^| FindStr /I /R /V
    /C:"%_ExcludeRegex%"
  ') DO (
    IF NOT DEFINED !_CurrentFile! (
      SET "!_CurrentFile!=Found"
      ECHO.File Name: !_FileName!
    )
    ECHO.%%a %%b
  )
)>> "_OutputFile"
PAUSE
如果需要的话,我会回来详细地写下正在做的事情

实际上,我只是使用DIR命令的一个循环来查找给定路径下所有目录和子目录中的所有.txt文件

然后,我解析文件名部分,并创建一个变量,如果该文件以前已经被解析过,我可以使用该变量进行匹配,以便只打印一次文件名

除非进行了匹配,否则我根本不想打印文件名,因为我认为您不想看到没有匹配的长文件列表,但是如果您希望删除之前测试是否找到文件名的逻辑,您可以在第一个循环中吐出文件名

第二个循环是循环在第一个循环中找到的给定文件上运行FindStr命令的结果,并匹配正则表达式,这意味着如果有更多的过程,则每个文件至少多两个条目


FindStr允许sregx匹配和/V意味着排除任何匹配的字符串并通过其余字符串。

好的,这应该可以做到,但我目前无法测试

@(
  ECHO OFF
  SETLOCAL EnableDelayedExpansion
  SET "_FilePath=C:\Admin"
  SET "_FileGlob=*.txt"
  SET "_MatchRegex1=Procedure =.*::.*$"
  SET "_MatchRegex2=Description = .*::.*$"
  SET "_ExcludeRegex=^SH Library Procedure =.*$"
  SET "_OutputFile=%Temp%\output file.txt"
)

FOR /F "Tokens=*" %%A IN ('
  DIR /A-D /S /B "%_FilePath%\%_FileGlob%"
') DO (
  SET "_FileName=%%~nxA"
  SET "_CurrentFile=!_FileName: =_!"
  FOR /F "Tokens=1*" %%a IN ('
    FindStr /I /R
    /C:"%_MatchRegex1%"
    /C:"%_MatchRegex2%"
    "%%A"
    ^| FindStr /I /R /V
    /C:"%_ExcludeRegex%"
  ') DO (
    IF NOT DEFINED !_CurrentFile! (
      SET "!_CurrentFile!=Found"
      ECHO.File Name: !_FileName!
    )
    ECHO.%%a %%b
  )
)>> "_OutputFile"
PAUSE
如果需要的话,我会回来详细地写下正在做的事情

实际上,我只是使用DIR命令的一个循环来查找给定路径下所有目录和子目录中的所有.txt文件

然后,我解析文件名部分,并创建一个变量,如果该文件以前已经被解析过,我可以使用该变量进行匹配,以便只打印一次文件名

除非进行了匹配,否则我根本不想打印文件名,因为我认为您不想看到没有匹配的长文件列表,但是如果您希望删除之前测试是否找到文件名的逻辑,您可以在第一个循环中吐出文件名

第二个循环是循环在第一个循环中找到的给定文件上运行FindStr命令的结果,并匹配正则表达式,这意味着如果有更多的过程,则每个文件至少多两个条目

FindStr允许sregx匹配和/V方法排除匹配的任何字符串并传递其余字符串。

@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
设置“filename1=%sourcedir%\q57185510.txt”
设置“outfile=%destdir%\outfile.txt”
(
对于/f“令牌=*”%%a,在(
'findstr/R/b/C:'*Procedure=“/C:'*Description=“%filename1%”
)做回显%%a
)>“%outfile%”
后藤:EOF
您需要更改
sourcedir
destdir
的设置以适应您的环境。清单使用了适合我的系统的设置

我使用了一个名为
q57185510.txt
的文件,其中包含用于测试的数据

生成定义为
%outfile%

我使用一个特定的文件进行测试;对于所有文件,然后将
filename1
设置为文件掩码,如
*.txt

findstr
在所有匹配
filename1
的文件中查找
/b
/r
正则表达式开头的行
/c:“regex string”
regex string。这里的“regex”是正则表达式的一个小子集,但感兴趣的特定表达式是例如Space(任意数量的)ProcedureSpace=,它匹配所讨论的两行

标记=*
抑制前导空格,生成所需的行。

@ECHO OFF
SETLOCAL
设置“sourcedir=U:\sourcedir”
设置“destdir=U:\destdir”
设置“filename1=%sourcedir%\q57185510.txt”
设置“outfile=%destdir%\outfile.txt”
(
对于/f“令牌=*”%%a,在(
'findstr/R/b/C:'*Procedure=“/C:'*Description=“%filename1%”
)做回显%%a
)>“%outfile%”
后藤:EOF
您需要更改
sourcedir
destdir
的设置以适应您的环境。清单使用了适合我的系统的设置

我使用了一个名为
q57185510.txt
的文件,其中包含用于测试的数据

生成定义为
%outfile%

我使用一个特定的文件进行测试;对于所有文件,然后将
filename1
设置为文件掩码,如
*.txt

findstr
在所有匹配
filename1
的文件中查找
/b
/r
正则表达式开头的行
/c:“regex string”
regex string。这里的“regex”是正则表达式的一个小子集,但感兴趣的特定表达式是例如Space(任意数量的)ProcedureSpace=,它匹配所讨论的两行


tokens=*
抑制前导空格,生成所需的行。

我试图改进文本文件内容的格式,请检查并随时重新设置。另外,我在代码中引入了一些缩进,这立即表明缺少一个结束符
。无论如何,您的代码并没有反映您想要的输出…我试图改进文本文件内容的格式,请检查并随时重新设置。另外,我在代码中引入了一些缩进,这立即表明缺少一个结束符
。无论如何,您的代码并没有反映您想要的输出…谢谢Magoo。现在,我向前一步,要求用户输入文件名和路径。如果需要,有没有办法创建配置文件
File Name = 
Procedure = sander_class::sander_class
Description = This test is to verify that constructor is called. Req Tested:  67060-SWINTR-73
@(
  ECHO OFF
  SETLOCAL EnableDelayedExpansion
  SET "_FilePath=C:\Admin"
  SET "_FileGlob=*.txt"
  SET "_MatchRegex1=Procedure =.*::.*$"
  SET "_MatchRegex2=Description = .*::.*$"
  SET "_ExcludeRegex=^SH Library Procedure =.*$"
  SET "_OutputFile=%Temp%\output file.txt"
)

FOR /F "Tokens=*" %%A IN ('
  DIR /A-D /S /B "%_FilePath%\%_FileGlob%"
') DO (
  SET "_FileName=%%~nxA"
  SET "_CurrentFile=!_FileName: =_!"
  FOR /F "Tokens=1*" %%a IN ('
    FindStr /I /R
    /C:"%_MatchRegex1%"
    /C:"%_MatchRegex2%"
    "%%A"
    ^| FindStr /I /R /V
    /C:"%_ExcludeRegex%"
  ') DO (
    IF NOT DEFINED !_CurrentFile! (
      SET "!_CurrentFile!=Found"
      ECHO.File Name: !_FileName!
    )
    ECHO.%%a %%b
  )
)>> "_OutputFile"
PAUSE