Как проверять файл каждую 1 минуту в скрипте Windows Bat? - PullRequest
0 голосов
/ 25 октября 2009

Я хочу написать скрипт для проверки текстового файла (журнала). Если размер журнала превышает 10 МБ, я хочу удалить некоторую часть файла, сохранить только последние 500 строк и удалить все старое содержимое.

Итак, есть две проблемы: как я могу проверять файл каждую 1 минуту и ​​как я могу удалить только часть содержимого?

Ответы [ 4 ]

1 голос
/ 25 октября 2009

Этот пакетный скрипт усекает файл, если его размер превышает 10 МБ. Он запишет последние 500 строк во временный файл, а затем перезапишет исходный файл временным файлом. Вы можете настроить размер файла и количество строк, изменив соответствующие значения переменных.

Вы можете использовать этот сценарий в запланированном задании, как описано Джейсоном Эвансом. На самом деле можно запускать задачу каждую минуту. Самый простой способ добиться этого - создать задачу с любой конфигурацией расписания и затем отредактировать ее. Затем вы расширили свойства для интервалов планирования, как каждую минуту.

Вот скрипт:

@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
1 голос
/ 25 октября 2009

Вы можете использовать tail.exe, который является частью Windows Server 2003 Resource Kit :

Tail - инструмент командной строки, который отображает заданное пользователем число последних строк текстового файла, такого как файл журнала, в окне консоли.

Для повторного выполнения, как уже упоминалось, вы можете использовать Windows Task Scheduler, который позволяет запускать задачу с частотой до 5 минут.

Что касается требования бегать каждую минуту, мне это кажется излишне высоким. Ваш файл журнала получает 10 МБ текста каждую минуту? Это означает, что он будет расти до 15 ГБ в день! Даже проверка каждые 5 минут кажется высокой.

1 голос
/ 25 октября 2009

Возможно, вы захотите взглянуть на решение на основе 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
        }
    }
}
1 голос
/ 25 октября 2009

Я могу помочь с первым пунктом, предложив создать запланированное задание в Windows для пакетного файла, запускаемого каждую минуту.

Что касается второго пункта, касающегося удаления части файла, в командном файле нет способа сделать это. Вам придется использовать VBScript или создать консольное приложение .NET для выполнения этой работы. Вы можете скачать Visual Basic / C # express и написать это консольное приложение.

РЕДАКТИРОВАТЬ: Моя ошибка, не похоже, что запланированное задание может выполняться каждую минуту. В этом случае вам лучше написать службу Windows, чтобы запускать задачу каждую минуту. Я не знаю, насколько тебе было бы удобно это делать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...