我想写一个bat脚本来检查文本文件(log)。如果日志超过10M,我想删除文件的某些部分,只保留最后500行,并删除所有旧内容。
所以有两个问题:如何每1分钟检查一次文件,如何只删除部分内容?
答案 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