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

Batch file 批处理-如果在日志文件中找到内容,则将其写入另一个日志文件,否则不执行任何操作,batch-file,cmd,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:

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

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

执行此操作的最佳方法是什么?

使用更灵活的
findstr
(即可以处理多个搜索字符串):

有关更多选项,请参见
findstr/?

根据您的评论“如果找到内容,我只想创建一个日志文件”:

你可以在最后。如果您甚至不想创建它,则必须使用
for
循环:

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

这里的诀窍是,如果有一个查找(
for
),则只在
do
之后执行代码(因此,如果没有查找,则不会发生重定向)。请注意,由于重复的
FileOpen
FileClose
事件,此方法的速度要慢得多(对于小文件,您不会注意到这一点,但对于大量发现,可能需要几秒钟,而不是几毫秒)

您没有回答我关于文件名中%DATE%的问题。所以这里有一个考虑到这一点的替代方案

@ECHO关闭
对于/F“EOL=L DELIMS=“%%A IN('WMIC OS GET LOCALDATETIME'),请在(%%A)中为%%B执行操作
)设置“TD=%%B”
DIR/B/A-D*.LOG^
|FINDSTR/IRF:/“0x0000000[235]0x00000020”>C:\BATCH\ERRORLOG\uu%TD:~,8%.log

这很好,但如果找到内容,我只想创建一个日志文件?我该怎么做?你需要更具体地完成你的任务。您想将什么写入错误日志文件?请记住,错误日志中的行不显示其原始文档似乎毫无意义。另外,您是否知道通常在%DATE%中找到的字符不允许出现在文件名中?请在提供更多数据以帮助满足您的请求后编辑/更新您的问题。我想从备份日志中读取错误,并监视Errorlog所在的文件夹,以查看是否发生错误。如有必要,我将进入完整日志。为什么不允许在%date%中使用字符?不是在所有可能的%date%变量输出中都允许使用,但许多变量都使用向后或向前斜杠,这是不允许的,而其他变量则使用我个人认为在文件名中很糟糕的点。此外,许多%DATE%格式的排序不方便。如果你看一下我的答案,你会发现我迎合了所有这些潜在的陷阱。在一些本地化中,
%date%
对于文件名来说是非常好的(例如它给了我
22.10.2016
(不好,但有效))。我也更喜欢像您这样的独立于语言的解决方案。
for /f "delims=" %%a in ('type *.log 2^>nul ^|findstr /i "0x00000002 0x00000003 0x00000005 0x00000020"') do echo %%a>>logfile