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