簡體   English   中英

比較上次修改的時間戳以使用批處理腳本更新文件

[英]Comparing last modified timestamps to update a file using batch script

我想創建一個批處理文件,它將讀取一個.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

現在,我無法比較時間戳,如果有人為實現這一目標做出了很大的幫助。

@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命令確保在批處理終止時放棄對環境所做的更改。

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

切換目錄后,已處理的文件將以唯一名稱(無論您選擇的是什么名稱,只要具有.log擴展名) copied到當前目錄-這會將文件的副本放置在日志目錄中,從而使可以執行。

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指令將原始目錄彈出回去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM