繁体   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