我想创建一个批处理文件,它将读取.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
现在我无法比较时间戳 如果有人为实现这一目标做出贡献,那将是很有帮助的。
答案 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.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
指令弹回原始目录。