批处理文件 - 循环前n行文本文件

时间:2018-03-21 21:46:21

标签: batch-file

我试图通过循环前10行来确定文本文件的格式,执行一些正则表达式匹配,然后比较最后的结果。我可以轻松遍历整个文件,但我只想要前N行(在本例中为10)

我熟悉其他语言,但这个批处理文件的特性让我感到厌恶。

这是我到目前为止所做的:

@echo off
setlocal enableDelayedExpansion
set /A REGEXCOUNTER=0
set /A COUNTER=0
for /F %A in (%submitfile%) do ( 
  set /A COUNTER=COUNTER+1
  rem echo %A
  setlocal enableDelayedExpansion
  echo(%A|findstr /r /c:"[0-9].*" >nul && (
  set /A REGEXCOUNTER=REGEXCOUNTER+1
  echo %COUNTER% - %REGEXCOUNTER% - FOUND - %A 
      rem any commands can go here
  ) || (
      echo NOT FOUND
      rem any commands can go here
  )


  rem LOOP END

  if %COUNTER% GEQ 10 do (goto loop_over)
  )
)
:loop_over
echo "END HERE!"

我已经设置了计数器,逐步计算我的匹配次数和循环次数。但是这里有一些变量值的示例输出:

110 - 0 - FOUND - 003
220 - 0 - FOUND - 2
330 - 0 - FOUND - 1
440 - 0 - FOUND - 029

每个循环的循环计数器变量增加10,正则表达式匹配计数器根本没有增加。我很确定这与变量范围有关,但我不知道从哪里开始。

2 个答案:

答案 0 :(得分:0)

这应该解决我在上面评论中谈到的所有问题。

@echo off
setlocal enableDelayedExpansion
set /A REGEXCOUNTER=0
set /A COUNTER=0
for /F %%A in (%submitfile%) do ( 
  set /A COUNTER=COUNTER+1
  rem echo %%A
  echo(%%A|findstr /r /c:"[0-9].*" >nul && (
  set /A REGEXCOUNTER=REGEXCOUNTER+1
  echo !COUNTER! - !REGEXCOUNTER! - FOUND - %%A 
      rem any commands can go here
  ) || (
      echo NOT FOUND
      rem any commands can go here
  )


  rem LOOP END

  if !COUNTER! GEQ 10 goto loop_over
  )
)
:loop_over
echo "END HERE"

答案 1 :(得分:0)

  1. 应删除循环中的额外setlocal。执行setlocal enabledelayedexpansion后,它将一直有效,直到执行setlocal disabledelayedexpansion或批处理终止为止。

  2. 每个%A(循环控件元变量必须为%%A(如果从命令行运行,则为%,如果在批处理文件)

  3. 如果更改循环中变量的值,则需要将已更改的值称为!varname!,而不是%varname%,这是原始值(搜索delayed expansion的SO)。 set /a始终适用于当前变量值。