Batch file 如何查找目录中所有TXT中指定的数值范围内的事件?

Batch file 如何查找目录中所有TXT中指定的数值范围内的事件?,batch-file,cmd,Batch File,Cmd,如何获取“FINDSTR”并在指定范围内查找值? 我设置了“字符串”:“20141001”和“20141030”。如果*.TXT文件中存在“20141017”,则应返回“ERRORLEVEL”=0 例如: @回音 SET DATE_STA=20141001 SET DATE_END=20141030 echo Looking for all the files in the folder echo within the range from %DATE_STA% to %DATA_END% .

如何获取“FINDSTR”并在指定范围内查找值? 我设置了“字符串”:“20141001”和“20141030”。如果*.TXT文件中存在“20141017”,则应返回“ERRORLEVEL”=0

例如:

@回音

SET DATE_STA=20141001
SET DATE_END=20141030

echo Looking for all the files in the folder
echo within the range from %DATE_STA% to %DATA_END% ...
echo.

:FINDING
findstr /r "%DATE_STA% to %DATA_END%" C:\Folder\*.txt
IF %ERRORLEVEL%==0 (
goto OKAY) else (
goto FAIL
)

:OKAY
cls
echo.
echo Located file that contains a value in the specified range.
echo.
pause
exit

:FAIL
cls
echo.
echo Any file located in this folder..
echo.
pause
exit
  • findstr
    与所需的regexp一起使用:

    findstr /r "\<201410[0-3][0-9]\>"
    
    上述解决方案将[错误地]捕获其他较大数字(如222222 0141001)中的数字,因此,如果这是不可取的,那么这里有一个更慢但更可靠的版本:

    @echo关闭
    删除“%temp%\datespan.txt”>nul 2>&1
    调用:makeDates 20141001 20141030“%temp%\datespan.txt”
    调用:makeDates 20151001 20151030“%temp%\datespan.txt”
    findstr/g:“%temp%\datespan.txt”/s C:\Folder\*.txt
    删除“%temp%\datespan.txt”
    暂停
    退出/b
    :制作日期
    setlocal enableDelayedExpansion
    设置“date1=%1”&设置“date2=%2”&设置“dateFile=%3”
    设置“y1=!date1:~0,4!”&设置“m1=1!date1:~4,2!”&设置“d1=1!date1:~6,2!”
    设置“y2=!date2:~0,4!”&设置“m2=1!date2:~4,2!”&设置“d2=1!date2:~6,2!”
    设置/a m1-=100,d1-=100,m2-=100,d2-=100
    通话:dateCalcLeap&通话:dateCalcMonth
    :dateNext
    设置“m=0!m1!”&设置“d=0!d1!”&设置“ymd=!y1!!m:~-2!!d:~-2!”
    如果!ymd!全球技术法规!日期2!结束本地和退出/b
    回声\^>>!日期文件!
    rem接下来的三行捕捉嵌入日期,如abc20141001、10_20141001_22
    回音[^^^^^^^^^^ 0-9]!ymd![^^^^0-9]>>!日期文件!
    回音[^^^^^^^^^^ 0-9]!ymd!\^>>>!日期文件!
    回声\^>!日期文件!
    设置/a d1+=1&如果!d1!全球技术法规!天哪!(
    设置“d1=1”&设置/a m1+=1&调用:dateCalcMonth
    如果!m1!全球技术法规12集“m1=1”和集/a y1+=1&调用:dateCalcLeap
    )
    转到下一个日期
    :dateCalcMonth
    如果!m1==2(设定/年度天数=28+闰年)其他(设定/年度天数=“31-(m1-1)%%7%%2”)
    退出/b
    :dateCalcLeap
    设置年份=0
    设置/a y4=y1%%4&如果!y4==0 (
    设置/a y100=y1%%100&如果不是!y100!==0设置年份=1
    设置/a y400=y1%%400&如果!y400!==0设置年份=1
    )
    退出/b
    

    • 我不知道有什么好的FINDSTR解决方案。但是有一个简单的解决方案,使用正则表达式文本处理实用程序,从XP开始在任何Windows机器上运行。它是纯脚本(混合批处理/JScript),不需要任何第三方可执行文件

      该解决方案使用一个简单的正则表达式,再加上命令行上提供的少量自定义JScript代码

      for /r %%F in (.) do @type "%%F\*.txt" 2>nul | jrepl "\d{8,}" "($0>=20141001 && $0<=20141030) ? $0 : false" /jmatch >nul && echo FOUND || echo NOT FOUND
      

      for/r%%F in(.)do@type“%%F\*.txt”2>num | jrepl”\d{8,}”($0>=20141001&&$0我看不到您在批处理文件中的任何位置使用
      FINDSTR
      。还请提供您已经进行的研究,以了解您的位置。
      FINDSTR
      无法进行数字检查,它在其他范围内搜索字符串…
      FINDSTR
      命令无法在指定范围内找到字符串”“。必须单独测试每个字符串:
      if!value!geq%DATE\u STA%if!value!leq%DATA\u END%goto ok
      ,但我们需要知道文件的格式才能编写解决方案。您可以使用
      findstr/R”201410…”
      查找对应于2014年10月的日期字符串,但这将返回包含此类日期的完整行,而不仅仅是日期字符串!当然,除非每个文件行只包含一个日期(我们需要知道文件的格式)…是的,简单的regexp是不够的。我添加了另一个解决方案。两个“解决方案”如果编号(日期)不正确,则将失败嵌入在一个较大的数字中。例如,120141001将给出一个假阳性。@dbenham,我已经使用
      \
      修复了这两个问题。感谢您的观察!是的,这是一个显著的改进。由于您注意到的假阳性,我永远不会使用第一个选项。但是最后一个选项应该可以工作,尽管是通过fairly复杂的代码。但是,如果由于FINDSTR而启用了短文件名,它可能仍然会失败。但此解决方案在纯本机批处理的范围内显示了良好的创造性。您可以通过使用我在JREPL解决方案中使用的带有类型和管道技巧的FOR/R来避免FINDSTR错误。这也将捕获到这可能是一件好事。
      findstr
      也可以模拟这种行为,添加
      [^0-9]20141001[^0-9]
      [^0-9]20141001\
      \还应该注意的是,如果有许多文件中包含大量非日期的数字(如
      1
      55
      等)此解决方案将比findstr慢,因为它在每个数字上执行提供的比较代码。使用更复杂的regexp可能很容易修复。@wOxxOm-自定义JScript的调用速度非常快,更复杂的regex需要自己进行更多处理。我不确定额外的regex处理速度uld比我的JScript中简单的数字比较快。但我确实继续编辑了正则表达式,以排除小于8位的数字。任何用户代码都需要一个沙箱在解释器中执行它,这会增加调用的开销,而正则表达式是在本机代码中内部处理的。您刚才所做的更改减少了在i7上处理18MB日志文件的时间从~6秒到~3秒。我的答案中使用纯字符串的朴素
      findstr
      解决方案需要0.03秒(30毫秒,快100倍),我的答案中的多字符串regexp findstr速度慢得离谱,而且需要一分钟以上(我已经停止了它).EDIT-我修改了代码以处理在最初阅读问题时错过的递归目录搜索。