2017-08-02 64 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" 
相關問題