[英]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.