在递归搜索目录时从文本文件中提取数据

时间:2013-07-15 17:18:15

标签: windows batch-file command-prompt

我有几个目录都包含一个单独的日志文件,我需要从中提取某些文本。这样的一个例子是log.txt包含information = 1,我需要在=之后提取所有数据。我不能使用powershell或任何其他语言。我从来没有批量编写脚本,所以我不知道从哪里开始。目前,我可以使用以下方法搜索包含此日志文件的目录:

dir /s log.txt > C:\saveLog.txt

2 个答案:

答案 0 :(得分:0)

您可以执行嵌套for循环,循环遍历外部循环中的文件,并在内部循环中查找日志文件中的信息行:

@echo off

setlocal ENABLEDELAYEDEXPANSION

for /f "delims=" %%i in ('dir /b /s log.txt') do (
  for /f "tokens=1* delims==" %%j in (%%~si) do (
    set _var=%%j
    set _var=!_var: =!
    if defined _var (
      if /i "!_var!"=="information" (
        echo Filename: %%i; Information: %%k
      )
    )
  )
)

endlocal

报告日志文件名(及其路径)以及每个文件中=签名后的信息。您可以根据需要更改echo行,以报告您要报告的内容。

FYI - 内部for循环将log.txt文件的每一行拆分为两部分。第一部分是=符号左侧的文字,可通过%%j访问。第二部分是=符号右侧的文本,可通过%%k访问。这是通过将/f "tokens=1* delims=="添加到for循环命令来完成的。

编辑1

  • 更改了内部for循环以使用短文件名,因此路径中的空格不会破坏循环。
  • %%j变量更改为实变量,以便我们可以进行字符替换并消除=符号前的空格(如果存在)。这会将%%k保留为=符号后面的内容。
  • if比较语句更改为不区分大小写。

答案 1 :(得分:0)

@echo off
for /F "tokens=1,3 delims=:=" %%a in ('findstr /S /C:"information = " log.txt') do (
   echo Filename: %%a; Information: %%b
)