Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file bat文件中文本文件的嵌套findstr_Batch File - Fatal编程技术网

Batch file bat文件中文本文件的嵌套findstr

Batch file bat文件中文本文件的嵌套findstr,batch-file,Batch File,我使用以下bat代码在一组文本文件中查找字符,并在找到的行后插入新行: for /R "%SrcFolder%" %%a in ("*.txt") do ( (for /f "usebackq delims=" %%h in ("%%a") do ( echo %%h echo "%%h"|findstr /I "{" > nul & if not errorlevel 1 ( echo NEW LINE ) ) 现在我想使用另一

我使用以下bat代码在一组文本文件中查找字符,并在找到的行后插入新行:

for  /R "%SrcFolder%"  %%a in ("*.txt") do (
  (for /f "usebackq delims=" %%h in ("%%a") do (
    echo %%h
    echo "%%h"|findstr /I "{" > nul & if not errorlevel 1 (
        echo NEW LINE
     )
)
现在我想使用另一个findstr来检查当前行的前一行(%%h)是否有特定字符(如“B”),如果有,则跳过插入新行

我希望我能问清楚。 有什么建议吗? 谢谢

试试这个:

@ECHO OFF &SETLOCAL disableDelayedExpansion
SET "InFileName=infile.txt"
SET "OutFileName=outfile.txt"
(FOR /f "delims=" %%a IN ('FINDSTR /n "^" "%InFileName%"') DO (
    SET "PrimLine=%%a"
    SETLOCAL enableDelayedExpansion
    SET "Line=!PrimLine:*:=!"
    ECHO(!Line!
    ECHO("!Line!"|FINDSTR "}" >nul && (
        SET "SecLine=!SecLine:*:=!"
        ECHO("!SecLine!"|FINDSTR /i "B" >nul || ECHO(
    )
    ENDLOCAL
    SET "SecLine=%%a"
))>"%OutFileName%"

下面的批处理代码满足您的要求:

@echo off
setlocal EnableDelayedExpansion

for /R "%SrcFolder%" %%a in ("*.txt") do (
   echo File: "%%a"
   set "prevLine="
   for /f "usebackq delims=" %%h in ("%%a") do (
      echo %%h
      rem Check if current line have "{" char:
      set thisLine=%%h
      if "!thisLine:{=!" neq "!thisLine!" (
         rem YES: Check if previous line have "B" char:
         if "!prevLine:B=!" equ "!prevLine!" (
            rem NO: insert the new line
            echo NEW LINE
         )
      )
      set "prevLine=!thisLine!"
   )
   echo -------------------
   echo/
)
但是,此方法不使用
findstr
,很抱歉

findstr.exe
是一个外部命令,每次执行时都需要加载约30 KB的文件。如果对文件的每一行执行
findstr
,有时执行两次,则程序的运行速度将比仅使用内部命令慢。如果一个文件很大,或者文件的数量很大,这两种方法之间的差异将非常明显…

@ECHO OFF
SETLOCAL
设置“srcfolder=。\cb4c”
对于“*.txt”中的/R“%SrcFolder%”%%a,请执行以下操作(
设置“checkme=Y”
对于/f“usebackq delims=“%%h in(“%%a”)do(
回声%%h
如果定义了,请检查我(
回显“%%h”| findstr/I“{”>NUL
如果不是错误级别1(回显新行)
)
回声“%%h”| findstr“B”>num
如果错误级别为1(设置“checkme=Y”),则为其他(设置“checkme=”)
)
)
后藤:EOF

(我已将
srcfolder
的测试设置保留在原位)

感谢您的回复。但是,即使代码中的这一行没有“{”字符:if”!thisLine:{=!“neq”!thisLine!”(只需在命令提示下测试它。输入:
set var=这不包含左大括号
,然后输入
如果“%var:{=%”neq“%var%”回显失败:即使var不包含左大括号,也始终为真,并检查结果!