比较上次修改的时间戳以使用批处理脚本更新文件

时间:2017-05-18 09:13:00

标签: windows batch-file command-line

我想创建一个批处理文件,它将读取.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

现在我无法比较时间戳 如果有人为实现这一目标做出贡献,那将是很有帮助的。

1 个答案:

答案 0 :(得分: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指令弹回原始目录。