Batch file 在动态文本中以变量形式存储行

Batch file 在动态文本中以变量形式存储行,batch-file,Batch File,我试图存储文本文件中的每一行,以便进行一些处理。 文本文件是动态的,它将随着更多的搜索条目而增长。 问题是,如果原始文本文件有10个条目,即使没有完成循环,也只会循环10次,因此会添加更多条目。是否可以在同一循环中循环其他新条目 @echo off SETLOCAL enabledelayedexpansion set /p search_parameter="Type your search: " rem run grep seach commmand grep -nri %search

我试图存储文本文件中的每一行,以便进行一些处理。 文本文件是动态的,它将随着更多的搜索条目而增长。 问题是,如果原始文本文件有10个条目,即使没有完成循环,也只会循环10次,因此会添加更多条目。是否可以在同一循环中循环其他新条目

@echo off

SETLOCAL enabledelayedexpansion

set /p search_parameter="Type your search: "

rem run grep seach commmand
grep -nri %search_parameter% --colour --include=*.{c,h} > text.txt

rem filter required lines into new text file
type text.txt | findstr /I "#include" | findstr /V "examples DELIVERY_REL" > text2.txt

set /A count=0
rem read text file line-by-line
for /F "tokens=* delims=" %%G in (text2.txt) do (
   set /A count+=1
   set "line=%%G"
   for /f "delims=:" %%i in ("!line!") do set "line=%%~nxi"

   if NOT "!line!"=="!line:.h=!" (
      grep -nri !line! --colour --include=*.{c,h} >> text2.txt
      rem echo %%G
   )
   echo count: !count!
   echo line: !line!
)
rem type text2.txt | findstr /I "#include" | findstr /V "examples DELIVERY_REL" > text3.txt

pause

echo on

在我的脑海中,我会反复阅读文件,跳过已经处理过的行,直到到达末尾。我将给出一个简短的示例代码:

@回音 延迟扩展 设置cnt=1 :loopfor 对于text2.txt do中的/F%skip%tokens=*delims=%%G 回声%%G 设置跳过=跳过=%cnt% 设置/a cnt+=1 后藤:循环 echo当文件中没有我们尚未处理的行时,我们在这里创建它。 需要变量skip,因为for/f skip=0。。。产生一个错误。 解释: 基本上,实际的for循环读取下一行,增加一个计数器,并通过转到loopfor标签并重复来中断for循环。我们使用递增的cnt变量跟踪下一行,然后跳过该行数。最大的缺点是一遍又一遍地读取该文件。 实际上,我可能会使用这样一个子程序:

@回音 延迟扩展 设置cnt=1 :loopfor 对于text2.txt do中的/F%skip%tokens=*delims=%%G 调用:进程%%~G 后藤:循环 echo当文件中没有我们尚未处理的行时,我们在这里创建它。 后藤:eof :进程 回声%1 设置跳过=跳过=%cnt% 设置/a cnt+=1 后藤:eof 我会尝试将这个概念塞进你的代码中,但你必须彻底测试它

@回音 SETLOCAL enabledelayedexpansion set/p search\u parameter=键入您的搜索: rem运行grep seach命令 grep-nri%search_参数%-color-include=*.{c,h}>text.txt rem将所需行筛选到新文本文件中 键入text.txt | findstr/I include | findstr/V示例交付_REL>text2.txt rem您可能可以使用变量count,但我还是会添加cnt 设置/A计数=0 rem逐行读取文本文件 rem从这里开始添加到原始代码中 设置cnt=0 设置跳过= :loopfor 对于text2.txt do中的/F%skip%tokens=*delims=%%G 设置/A计数+=1 设置行=%%G 对于/f delims=:%%i in!线do set line=%%~nxi 如果不是!行!==!行:.h=! grep-nri!排队-颜色-包含=*.{c,h}>>text2.txt rem回声%%G 回声计数:!计数 回音线:!线 设置跳过=跳过=%cnt% 设置/a cnt+=1 后藤:循环 rem类型text2.txt | findstr/I包括| findstr/V示例交付_REL>text3.txt 暂停 呼应 注意-这并不能解释文件收缩的原因。它只能生长。 如果您想变得更花哨一点,可以等待更多的输入:

@回音 延迟扩展 设置cnt=1 :loopfor 对于text2.txt do中的/F%skip%tokens=*delims=%%G 回声%%G 设置跳过=跳过=%cnt% 设置/a cnt+=1 后藤:循环 我们到达了文件的末尾。暂停10秒钟,然后再次扫描文件。 超时/t 10>nul 后藤:循环
这将永远等待。但这并不完全是一个无限循环,因为最终要么for循环会因skip=number变大而阻塞,要么就set/a cnt+=1命令而言,您将达到大约20亿的cmd限制—假定输入文件继续增长。

我会这样做:

@echo off
setlocal

rem Process each input line until the EndOfFile of a dynamic growing file
set "count=0"
call :ProcessFile < test.txt >> test.txt
echo %count% lines processed...
goto :EOF


:ProcessFile

rem Read next line
set "line="
set /P "line="

rem Test if EOF found
if not defined line goto :EOF

set /A count+=1
echo %count%- %line% > CON

rem Randomly generate a new line
if %time:~-1% geq 5 echo Added %line%

goto ProcessFile

我收到这个错误,tokens=*delims=此时是意外的。如果变量cnt没有在for循环之前初始化,就会发生这种情况。
1- Line one
2- Line two
3- Line three
4- Added Line one
5- Added Line two
6- Added Line three
7- Added Added Line one
8- Added Added Line two
9- Added Added Line three
10- Added Added Added Line one
10 lines processed...