[英]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.log
和processedfile.log
第一次出現在列表中會導致代碼分支要么process
來處理數據( processedfile.log
文件比早期error.log
所以新的數據已經添加)或end
( error.log
較早,因此未添加新數據)
我對您的findstr
只做了一個小改動-添加了/c:
並引用了目標字符串。 這在很大程度上是多余的,但是如果您將字符串更改為包含空格,則它將為findstr
提供逐字目標。 我不知道該處理的其余細節,因為我不知道所需處理的確切細節。
請注意,在您的代碼中, DirToSearch
和LineToRead
被重新分配在代碼塊內(括號內的一系列行)。 這將無法正常工作,因為整個代碼塊都將被解析然后執行,並且解析過程會在解析時將%var%
替換為其值。 您的代碼失敗-因為您沒有使用setlocal
,所以一旦代碼運行,變量將保持分配狀態,以后運行的代碼將使用先前運行中分配的值。
需要注意的是:
在不要求goto
除非在特定goto :eof
,意思是“去檔案結尾”。
您的goto end
是多余的,因為end
直接跟隨goto
-但是同樣,它失敗了。 代碼塊中的標簽終止該塊。 在這種情況下,這是無關緊要的,因為標簽后面沒有重要的內容。
到達標簽:end
,該過程現在刪除已處理文件的副本,並使用popd
指令將原始目錄彈出回去。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.