2009-10-25 10 views
0

Je veux écrire un script chauve-souris pour vérifier un fichier texte (journal). Si le journal est supérieur à 10 Mo, je souhaite supprimer une partie du fichier, ne conserver que les 500 dernières lignes et supprimer tout le contenu ancien.Comment vérifier un fichier toutes les minutes dans un script Windows Bat?

Il y a donc deux problèmes: comment puis-je vérifier le fichier toutes les minutes et comment puis-je supprimer seulement une partie du contenu?

+0

quel type de fichier journal est-ce? Il pourrait être plus facile de contrôler la taille maximale du fichier à partir de l'application qui le génère. –

+0

l'histoire est que, quelqu'un crée une application console .net, ils impriment seulement le journal à la console, ne pas utiliser toute technologie de journalisation. alors j'ai besoin d'écrire un script de chauve-souris pour garder tous ces journaux. (diriger les sorties dans un fichier texte.) mais le fichier journal va continuer à croître, je veux faire un truc pour maintenir en quelque sorte le fichier journal à une certaine taille seulement. de sorte que je n'ai pas besoin de s'inquiéter du problème de sotrage. – jojo

Répondre

1

Je peux vous aider avec le premier point en suggérant que vous créez un scheduled task, dans Windows, pour que le fichier séquentiel s'exécute toutes les minutes.

Observe le deuxième point, sur la suppression d'une partie du fichier, il n'y a aucun moyen dans le fichier de commandes que vous pouvez faire cela. Vous devez utiliser VBScript ou créer une application de console .NET pour faire le travail. Vous pouvez télécharger Visual Basic/C# express et écrire cette application de console.

EDIT: Mon erreur, il ne semble pas qu'une tâche planifiée peut s'exécuter toutes les minutes. Dans ce cas, il vaut mieux écrire un service Windows pour exécuter la tâche chaque minute. Je ne sais pas à quel point tu serais à l'aise avec ça?

+0

Pourquoi n'y a-t-il aucun moyen de supprimer une partie d'un fichier d'un script batch? –

+0

Je veux savoir aussi – jojo

+0

Pour autant que je sache, les commandes du fichier de commandes Windows ne contiennent rien qui puisse manipuler le contenu d'un fichier. Seul PowerShell ou l'écriture de votre propre application utilitaire en utilisant un langage de programmation va le faire. –

1

Vous pouvez utiliser tail.exe, qui fait partie du Windows Server 2003 Resource Kit:

Tail est un outil de ligne de commande qui affiche un nombre spécifié par l'utilisateur des dernières lignes d'un fichier texte, comme un fichier journal , dans une fenêtre de console. Pour la partie exécution répétée, comme mentionné précédemment, vous pouvez utiliser Windows Task Scheduler, qui vous permet d'exécuter la tâche à une fréquence de 5 minutes maximum. En ce qui concerne l'exigence d'exécuter chaque minute, cela me semble inutilement élevé. Est-ce que votre fichier journal reçoit 10 Mo de texte par minute? Cela signifie qu'il pourrait atteindre 15 Go en un jour! Même le vérifier toutes les 5 minutes semble élevé.

+0

+1 pour le non-fonctionnement toutes les minutes –

1

Vous voudrez peut-être examiner une solution basée sur PowerShell.

Ce script est pas exactement ce que vous voulez, mais il est proche

$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

Ce script batch tronquer un fichier si elle est supérieure à 10 Mo. Il écrira les 500 dernières lignes dans un fichier temporaire, puis écrasera le fichier original avec le fichier temporaire. Vous pouvez ajuster la taille du fichier et le nombre de lignes en modifiant les valeurs de variable appropriées.

Vous pouvez utiliser ce script dans une tâche planifiée telle que décrite par Jason Evans. En fait, il est possible de lancer la tâche chaque minute. Le moyen le plus simple d'y parvenir est de créer une tâche avec n'importe quelle configuration de planning et de la modifier ensuite. Vous avez ensuite des propriétés étendues pour les intervalles de planification, comme chaque minute.

est le script ici:

@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 
Questions connexes