我试图通过循环前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,正则表达式匹配计数器根本没有增加。我很确定这与变量范围有关,但我不知道从哪里开始。
答案 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)
应删除循环中的额外setlocal
。执行setlocal enabledelayedexpansion
后,它将一直有效,直到执行setlocal disabledelayedexpansion
或批处理终止为止。
每个%A
(循环控件元变量必须为%%A
(如果从命令行运行,则为%
,如果在批处理文件)
如果更改循环中变量的值,则需要将已更改的值称为!varname!
,而不是%varname%
,这是原始值(搜索delayed expansion
的SO)。 set /a
始终适用于当前变量值。