我有一个小批量搜索日志文件中的错误代码,当找到时将其写入另一个。它总是创建一个新的日志文件,但我只想在找到内容时创建一个新的日志文件。
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
这样做的最佳方式是什么?
答案 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
之后执行代码,如果有结果(因此没有重定向,如果没有发现)。请注意,由于重复的FileOpen
和FileClose
事件,这种方法要慢得多(你没有注意到它有小文件,但是有大量的发现,相比之下它可能需要几秒钟的时间到几毫秒)
答案 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