批处理 - 如果在日志文件中查找内容,则将其写入另一个日志文件,否则不执行任何操作

时间:2016-10-20 09:26:29

标签: batch-file cmd

我有一个小批量搜索日志文件中的错误代码,当找到时将其写入另一个。它总是创建一个新的日志文件,但我只想在找到内容时创建一个新的日志文件。

type *.log |find /i "0x00000002" >> C:\Batch\ERRORLOG_%date%.log
type *.log |find /i "0x00000003" >> C:\Batch\ERRORLOG_%date%.log
type *.log |find /i "0x00000005" >> C:\Batch\ERRORLOG_%date%.log
type *.log |find /i "0x00000020" >> C:\Batch\ERRORLOG_%date%.log

这样做的最佳方式是什么?

2 个答案:

答案 0 :(得分:2)

使用findstr,这有点灵活(即可以处理多个搜索字符串):

type *.log |findstr /i "0x00000002 0x00000003 0x00000005 0x00000020" >logfile

请参阅findstr/?了解更多选项

适应您的评论“我只想在找到内容时创建日志文件”

最后你可以delete the resulting file if it's empty。如果您不希望它甚至被创建,则必须使用for循环:

for /f "delims=" %%a in ('type *.log 2^>nul ^|findstr /i "0x00000002 0x00000003 0x00000005 0x00000020"') do echo %%a>>logfile

这里的诀窍是,for仅在do之后执行代码,如果有结果(因此没有重定向,如果没有发现)。请注意,由于重复的FileOpenFileClose事件,这种方法要慢得多(你没有注意到它有小文件,但是有大量的发现,相比之下它可能需要几秒钟的时间到几毫秒)

答案 1 :(得分:0)

您没有回答我对文件名中%DATE%的疑虑。所以这是考虑到这一点的另一种选择。

@ECHO OFF
FOR /F "EOL=L DELIMS=" %%A IN ('WMIC OS GET LOCALDATETIME') DO FOR %%B IN (%%A
    ) DO SET "TD=%%B"
DIR/B/A-D *.LOG^
    |FINDSTR/IRF:/ "0x0000000[235] 0x00000020">C:\BATCH\ERRORLOG_%TD:~,8%.log