【问题标题】:Comparing last modified timestamps to update a file using batch script比较上次修改的时间戳以使用批处理脚本更新文件
【发布时间】:2017-05-18 09:13:00
【问题描述】:

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

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

【问题讨论】:

标签: windows batch-file command-line


【解决方案1】:
@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指令弹出原始目录。

【讨论】:

  • hi magoo 感谢您以如此浓厚的兴趣进行解释,我从您的回答中学到了很多东西。感谢支持
猜你喜欢
  • 1970-01-01
  • 2011-08-06
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多