2017-05-18 36 views
0

我想創建一個批處理文件,它將讀取.log文件,然後從中讀取錯誤並追加到.txt文件。 但我不希望批處理每次都重寫.txt,所以現在我正在比較這兩個文件的最後修改時間戳,然後只追加最新的更新。 以下是批處理文件比較上次修改的時間戳以使用批處理腳本更新文件

@echo off 


color 3 
cls 

@FOR %%A IN ("%ProgramFiles(x86)%\Apache Software Foundation\Apache2.2\logs\error.log") DO @(ECHO=%%~tA& set timestamp=%%~tA) 

echo %timestamp% 


@FOR %%A IN ("D:\error.txt") DO @(ECHO=%%~tA& set timestamp2=%%~tA) 

echo %timestamp2% 

if %timestamp% gtr %timestamp2% (

set DirToSearch="C:\Program Files (x86)\Apache Software Foundation\Apache2.2\logs" 
set LineToRead="error" 

pushd %DirToSearch% 



for /r %%f in (error.log) do (
For /F "tokens=*" %%l in ('Findstr /L /I %LineToRead% "%%f"') do (
if %%l equ " " (
    echo File:"%%f" is Not OK >> D:\FileStatus.txt 
) else (
    echo Line: %%l>>D:\error.txt 

     ) 
       ) 
) 

Goto :End 

:End 
popd 
) 
pause 
exit 

現在我在這裏無法時間戳 比較這將是巨大的幫助,如果任何人都有助於實現這一目標。

+0

比較時間戳的最佳方法是與unixtimestamps進行比較。也許你看看這裏:https://unix.stackexchange.com/questions/84381/how-to-compare-two-dates-in-a-shell –

+3

可能的重複[如何比較DOS批處理文件的時間戳腳本?](http://stackoverflow.com/questions/1687014/how-do-i-compare-timestamps-of-files-in-a-dos-batch-script) – JosefZ

回答

0
@echo off 
SETLOCAL 
set "DirToSearch=C:\Program Files (x86)\Apache Software Foundation\Apache2.2\logs" 
set "processedfile=D:\error.txt" 
set "LineToRead=error" 

pushd %DirToSearch% 
COPY "%processedfile%" ".\processedfile.log" >nul 2>nul 
for /f "delims=" %%a in ('dir /b /a-d /od *.log') do (
if /i "%%a"=="error.log" goto end 
if /i "%%a"=="processedfile.log" goto process 
) 

:process 
for /r %%f in (error.log) do (
For /F "tokens=*" %%l in ('Findstr /L /I /C:"%LineToRead%" "%%f"') do (
if %%l equ " " (
    echo File:"%%f" is Not OK >> D:\FileStatus.txt 
) else (
    echo Line: %%l>>D:\error.txt 

     ) 
       ) 
) 

:end 
del "processedfile.log" 
popd 

pause 
exit 

我已經從代碼中刪除了絨毛。

。注意,@echo off語句之後,@在命令的開始是冗餘的(@command表示「不呼應命令)

setlocal命令可以確保對環境作出更改將被丟棄時的批次終止

注引號的新位置。 - 以確保分配給變量的值不包括任何可能的雜散尾部空格

切換目錄之後,將處理的文件是copied添加到當前目錄的唯一名稱(無論您選擇哪個名稱,只要其擴展名爲.log),都會將該文件的副本放在日誌目錄中,以便執行魔術。

dir命令報告找到的.log文件的名稱; /od按時間戳順序提供列表。因此,這兩個文件error.logprocessedfile.log第一次出現在列表中的任何一個會導致代碼分支要麼process來處理數據(processedfile.log文件比error.log所以新數據已添加更早)或enderror.log早,所以沒有新的數據添加)

我只做了一個小的改變,以您的findstr - 增加了/c:並引用了目標字符串。這在很大程度上是多餘的,但是如果您將字符串更改爲包含空格,則它會爲findstr提供逐字目標。由於我不知道所需處理的具體細節,因此處理的其餘部分如此。

注意,在代碼中,DirToSearchLineToRead正在內的碼塊(一系列的線包含在括號中)重新分配。這將不起作用,因爲整個代碼塊被解析然後執行,並且解析過程在解析時間處用其值替換任何%var%。您的代碼無法失敗 - 因爲您沒有使用setlocal,代碼運行後,變量仍保持分配狀態,將來運行時的代碼將使用之前運行中分配的值。

請注意,goto中不需要:,但在特定的goto :eof中表示「轉到文件結束」。

您的goto end是多餘的,因爲end直接跟在goto之後 - 但它又失敗了。代碼塊中的標籤終止該塊。在這種情況下,這是無關緊要的,因爲沒有重要的標籤。

到達標籤:end後,該過程現在刪除處理文件的副本,並用popd指令將原始目錄彈回。

+0

嗨magoo謝謝你解釋這麼深興趣,我從你的答案中學到了更多的東西。感謝支持 –

相關問題