在“X”日期之后查找字符串

时间:2014-11-17 19:05:17

标签: string date batch-file find

我有一个包含300多个文本文件的文件夹;我正在尝试创建一个批处理脚本,该脚本将在特定日期之后找到任何内容,并在每个文本中包含以下行:

---------- \ SC #### SVR #### \ E $ \ USERS \ SC #### POS #### \ E2ELOGS \ PED_ 20141116 _110913.DBG:1

如所示,日期格式为 YYYYMMDD

例如:

set filedatetime=10/11/2014 12:26
set filedatetime=%filedatetime:~6,4%%filedatetime:~3,2%%filedatetime:~0,2%
echo "%filedatetime%"

FINDSTR "%FILEDATETIME%" C:\RESULTS\*.TXT

如果findstr结果是GTR而不是20141110,则将该行传回另一个txt文件。

3 个答案:

答案 0 :(得分:0)

如果字符串的日期部分始终位于同一位置,则只需使用字符串处理函数将其解析出来。此时,如有必要,将其转换为整数,然后将结果与目标日期进行比较。

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
SET filedatetime=20141116
SET "sourcedir=U:\sourcedir\t w o"

(
FOR /f "tokens=1-3delims=_" %%a IN ('findstr /r ".*_.*_.*" "%sourcedir%\*.txt"') DO (
 IF %%b geq %filedatetime% ECHO %%a_%%b_%%c
)
)>newfile.txt

TYPE newfile.txt

GOTO :EOF

您需要更改sourcedir的设置以适合您的具体情况。

生成新文件newfile.txt

我使用固定日期以方便测试。

geq生成等于或大于所选日期的行。 gtr的收益率将严格大于。


这是我的测试数据(我已将其缩写)

-S\PED_20140129_110913.DBG: 1 
-S\PED_20140229_110913.DBG: 1 
-S\PED_20140329_110913.DBG: 1 
-S\PED_20140429_110913.DBG: 1 
-S\PED_20140529_110913.DBG: 1 
-S\PED_20140629_110913.DBG: 1 
-S\PED_20140729_110913.DBG: 1 
-S\PED_20140829_110913.DBG: 1 
-S\PED_20140929_110913.DBG: 1 
-S\PED_20141029_110913.DBG: 1 
-S\PED_20141129_110913.DBG: 1 
-S\PED_20141229_110913.DBG: 1 

结果:

U:\sourcedir\t w o\extra.txt:-S\PED_20141129_110913.DBG: 1 
U:\sourcedir\t w o\extra.txt:-S\PED_20141229_110913.DBG: 1 

我建议问题出现在文件名部分 - 如果出现下划线,则会采用不正确的字符串进行比较。

您可以使用(替换if声明)

对此进行测试
IF %%b geq %filedatetime% ECHO "%%b" geq "%filedatetime%"

将显示正在比较哪些字符串。

这应解决这个问题:

@ECHO OFF
SETLOCAL
SET filedatetime=20141116
SET "sourcedir=U:\sourcedir\t w o"

(
FOR /f "tokens=1,2,*delims=:" %%p IN ('findstr /r ".*_.*_.*" "%sourcedir%\*.txt"') DO (
 FOR /f "tokens=1-3delims=_" %%a IN ("%%r") DO (
  IF %%b geq %filedatetime% ECHO %%p:%%q:%%a_%%b_%%c
 )
)
)>newfile.txt

TYPE newfile.txt

GOTO :EOF

将文件名与数据分开,然后单独处理数据。

答案 2 :(得分:0)

@echo off
setlocal

set /a filedatetime=20141124
set sourcedir=
set outfile=E:\outfile.txt

REM There are 3 underscores per record in the input files, creating 4 tokens. The third token (%%c) is the date in the filename.
REM Due to the presence of at least one backup file named "BACK_*", which adds a fourth underscore, we filter that out.

for /f "tokens=1-4 delims=_" %%a in ('findstr /r ".*_.*_.*" "%sourcedir%\*.txt"') DO (
if %%c geq %filedatetime% echo %%a_%%b_%%c_%%d | find /I /V "BACK" >>%outfile%
)

rem type newfile.txt

goto :EOF
exit