如何在Windows bat脚本中每1分钟检查一次文件?

时间:2009-10-25 11:57:48

标签: windows scripting batch-file

我想写一个bat脚本来检查文本文件(log)。如果日志超过10M,我想删除文件的某些部分,只保留最后500行,并删除所有旧内容。

所以有两个问题:如何每1分钟检查一次文件,如何只删除部分内容?

4 个答案:

答案 0 :(得分:1)

我可以通过建议您在Windows中创建scheduled task来帮助批处理文件每分钟运行一次。

关于第二点,关于删除文件的一部分,批处理文件中没有办法可以做到这一点。您必须使用VBScript,或构建一个.NET控制台应用程序来完成这项工作。您可以下载Visual Basic / C#express并编写该控制台应用程序。

编辑:我的错误,看起来没有计划任务可以每分钟运行一次。在这种情况下,你最好每分钟编写一个Windows服务来运行任务。我不知道你这样做会有多舒服吗?

答案 1 :(得分:1)

您可以使用tail.exe,它是Windows Server 2003 Resource Kit

的一部分

Tail是一个命令行工具,它在控制台窗口中显示用户指定的文本文件的最后几行,例如日志文件。

对于重复执行部分,正如其他人所提到的,您可以使用Windows任务计划程序,它允许您以最多每5分钟的频率运行任务。

至于每分钟运行的要求,对我来说这似乎是不必要的。您的日志文件是否每分钟都有10 MB的文本?这意味着它将在一天内增长到15 GB!即使每5分钟检查一次也很高。

答案 2 :(得分:1)

您可能希望了解基于PowerShell的解决方案。

这个脚本不是你想要的,但它很接近

$fsw = New-Object System.IO.FileSystemWatcher 
$fsw.Path = $env:TEMP
$fsw.Filter = "log.txt"
while ($true)
{
    Write-Host "Waiting"
    if ($fsw.WaitForChanged("Changed",1000).ChangeType -eq "Changed")
    {
        $len = Get-ItemProperty -Path $env:TEMP\log.txt -Name Length
        if ($len.Length -gt 10GB)
        {
            Write-Host "Removing"
            Remove-Item $env:TEMP\log.txt
        }
    }
}

答案 3 :(得分:1)

如果文件大于10 MB,则此批处理脚本将截断该文件。它会将最后500行写入临时文件,然后使用临时文件覆盖原始文件。您可以通过更改相应的变量值来调整文件大小和行数。

您可以在Jason Evans所描述的计划任务中使用此脚本。实际上,每分钟都可以启动任务。实现此目的的最简单方法是使用任何计划配置创建任务,然后进行编辑。然后你就有了扩展的调度间隔属性,比如每分钟。

这是脚本:

@ECHO OFF

REM REMAINING_LINES holds the number of lines to keep 
SET REMAINING_LINES=500

REM define file size limit to be 10 MB
SET FILE_SIZE_LIMIT=10737418240

REM check if file exists
IF NOT EXIST "%1" GOTO END

REM check file size by parsing the output of DIR command
FOR /F "tokens=3" %%A IN ('dir /-c /n "%1" ^| more +5') DO (
    IF /I %%A GTR %FILE_SIZE_LIMIT% GOTO TRUNCATE
    GOTO END
)

:TRUNCATE

REM COUNT holds the number of lines in the file
SET COUNT=0

REM count lines by incrementing count by 1 for each line in input file
FOR /F %%l in ('type "%1"') DO SET /A COUNT+=1

REM calculate the line offset
SET /A LINE_OFFSET=%COUNT%-%REMAINING_LINES%

REM check we have at least two lines remaining
IF /I %LINE_OFFSET% LEQ 1 GOTO END

REM write remaining lines to temp file
MORE +%LINE_OFFSET% "%1" > "%1.tmp"

REM overwrite input file with temp file 
MOVE /Y "%1.tmp" "%1"

ECHO %1 truncated.

:END