找到最新的文件并搜索字符串

时间:2017-08-02 09:02:38

标签: batch-file cmd

我有一个文件夹中的文本文件列表,我想:

  1. 在文件夹

  2. 中查找最新文件
  3. 在最新的文件中,找到string =“Error”

  4. 使用string =“Error”

  5. 复制整行
  6. 如果找到的错误超过1个,请同样复制

  7. 下面的脚本很简单,我对批处理脚本很新,可以帮我纠正使它工作吗?

    set today=%date:~10,4%%date:~4,2%%date:~7,2%
    set today_day=%date:~7,2%
    set today_year=%date:~10,4%
    set today_month=%date:~4,2%
    set log_path=C:\path\Log\
    set string=Error
    
        FOR /F "delims=" %%I IN ('DIR %log_path%\*.* /A:-D /O:-D /B') do set LATEST=%%I
            If findstr /I /R /C:"%string%" %%I Do
            Echo Copy the Error Message row
                Else exit
    

3 个答案:

答案 0 :(得分:0)

你想的更容易一些。 (而你的if逻辑根本不起作用)

FOR /F "delims=" %%I IN ('DIR %log_path%\*.* /A:-D /O:D /B') do set "LATEST=%%~fI"
findstr /I /R /C:"%string%" "%LATEST%" 

答案 1 :(得分:0)

...
FOR /F "delims=" %%I IN ('DIR %log_path%*.* /A:-D /O:-D /B') do (
 findstr /I /L /C:"%string%" "%log_path%%%I" 
 goto done
)
echo none found!
:done

dir仅以反转日期顺序生成文件NAMES,因此第一个文件是最新的。此名称已分配给%%I

然后findstr将在文件中找到所需的字符串,作为LITERAL(/L);需要从目录中汇编名称,因为/B命令上的dir开关仅提供名称。加上引号以允许目标路径包含分隔符。

就个人而言,我从路径名中省略了结束\并在必要时插入它们。由于您已在变量中包含终端\,因此您的代码会将两个\串在一起。

答案 2 :(得分:0)

其他答案已经显示了如何在目录(dirfor /F)中找到最新(上次修改过的)文件:

set "string=Error"
set "log_path=C:\path\Log"

for /F "delims= eol=|" %%F in ('
    dir /B /A:-D /O:D "%log_path%\*.*"
') do (
    set "latest=%%F"
)

findstr /I /R /C:"\<%string%\>" "%log_path%\%latest%"

findstr命令行以不区分大小写的方式(Error)返回包含单词/I的所有行。搜索字符串中的\<\>表示字边界,因此搜索字符串必须是单个字,因此字符串Errors不构成匹配。这仅适用于正则表达式搜索(/R),这意味着您必须转义某些元字符,例如.*^,{{1您的搜索字符串中的{}},$[]位于\前面,以字面形式对待。
如果您希望\构成匹配项,请移除Errors或将其替换为/R以强制进行文字搜索。

如果您想将/L的输出写入文件,请使用redirection

findstr