2017-08-02 61 views
-1

我有一个文件夹中的文本文件列表,我想:寻找最新的文件,然后搜索字符串

  1. 找到该文件夹​​

  2. 在最新文件在最新文件中,找到字符串=“错误”

  3. 复制整行用绳子=“错误”

  4. 如果有超过1个发现错误,复制,因为它还有

脚本下面很简单,我对批处理脚本很陌生,可以帮助我正确地使它工作吗?

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 
+0

不要[双后(https://stackoverflow.com/q/45436031)! – aschipfl

+0

“复制整行”是什么意思?你想在哪里复制它?一份文件? – aschipfl

回答

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%" 
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产生的文件名只在反向日期顺序,所以第一个文件是最新的要求。这个名字被分配到%%I

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

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

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)完成,这意味着你要逃避一定的元字符,如.*^$[]\在搜索与\前面的字符串字面处理。
如果您想要构成匹配项,请删除/R或将其替换为/L以强制文字搜索。

如果你想写的findstr输出到一个文件,使用redirection

findstr /I /R /C:"\<%string%\>" "%log_path%\%latest%" > "error_log.txt" 
相关问题