Batch file 查找最新文件并搜索字符串

Batch file 查找最新文件并搜索字符串,batch-file,cmd,Batch File,Cmd,我有一个文件夹中的文本文件列表,我想: 在文件夹中查找最新的文件 在最新文件中,找到字符串=“Error” 使用string=“Error”复制整行 如果发现多个错误,请同时复制它 下面的脚本很简单,我对批处理脚本很陌生,能帮我更正使其正常工作吗 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%

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

  • 在文件夹中查找最新的文件

  • 在最新文件中,找到字符串=“Error”

  • 使用string=“Error”复制整行

  • 如果发现多个错误,请同时复制它

  • 下面的脚本很简单,我对批处理脚本很陌生,能帮我更正使其正常工作吗

    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
    

    你想起来容易一点。(如果逻辑根本不起作用,您的

    dir
    只按相反的日期顺序生成文件名,因此第一个文件是所需的最新文件。此名称已分配给
    %%I

    然后,
    findstr
    将定位所需字符串,作为文件中的文本(
    /L
    );由于
    dir
    命令上的
    /B
    开关仅提供名称,因此需要从目录中组合名称。加引号以允许目标路径包含分隔符


    就我个人而言,我省略了路径名中的结尾
    \
    ,并在需要的地方插入它们。由于您已将终端
    \
    包含在变量中,因此您的代码将把两个
    \

    串在一起。其他答案已经显示了如何在目录(,)中查找最新(上次修改)的文件:

    设置“字符串=错误”
    设置“log\u path=C:\path\log”
    对于/F“delims=eol=|”%%F英寸('
    目录/B/A:-D/O:D“%log\u path%\*.*”
    ""做"(
    设置“最新=%%F”
    )
    findstr/I/R/C:“\”“%log\u path%\%latest%”
    
    findstr
    命令行以不区分大小写的方式返回包含单词
    Error
    的所有行(
    /I
    )。搜索字符串中的
    \
    表示单词边界,因此搜索字符串必须是单个单词,因此字符串
    Errors
    不构成匹配。这仅在正则表达式搜索(
    /R
    )完成时有效,这意味着您必须通过在搜索字符串前面加上
    \
    来转义某些元字符,如
    ^
    $
    ]
    \
    ,以逐字处理。
    如果希望
    错误
    构成匹配,请删除
    /R
    或将其替换为
    /L
    以强制文字搜索

    如果要将
    findstr
    的输出写入文件,请使用:

    findstr/I/R/C:“\”“%log\u path%\%latest%”>“error\u log.txt”
    
    不要!“复制整行”是什么意思?你想把它复制到哪里?档案?
    FOR /F "delims=" %%I IN ('DIR %log_path%\*.* /A:-D /O:D /B') do set "LATEST=%%~fI"
    findstr /I /R /C:"%string%" "%LATEST%" 
    
    ...
    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