Textfiles automatisch kürzen?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

edit: Powershell kann normal nur mit Dateien bis 2 GB arbeiten desshalb bitte keine 6GB-Monster anbieten (evtl beim ersten lauf vorher von hand kürzen

Textdateien Lassen sich am einfachsten Zeilenweise verarbeiten. Ich mache mir deshalb nicht die Mühe irgendwie mit einer festen Anzahl von Restzeichen zu arbeiten. Soundsoviele Zeilen der Logs werden behalten und gut is.

Wie ich annehme sollen lediglich die letzten X Zeilen behalten werden.

Im folgenden Powershell-Script werden die im Angegebenen Ordner befindlichen Dateien mit der Extension .log ermittelt. Wenn Dateien größer als 1MB sind, wird werden diese Eingelesen und nur die letzten $NewSize_Lines Zeilen wieder zurückgeschrieben. Wieviel Zeilen Du behalten möchtest kannst Du in der 3 Zeile festlegen.

demo.ps1

$WorkPath='C:\Users\bubb\woauchimmer\Log'
$MaxSize = 1MB
$NewSize_Lines = 1000 #die neue Zielgröße in Zeilen angeben, Logs sind Zeilenorientiert!

Get-ChildItem -Path $WorkPath -Filter '*.log'|
  Where-Object {$_.Length -gt $MaxSize} |
  Foreach-Object{
    Write-Host $( 'Found File: {0} Size: {1:F2} MB'-f $_.Name,($_.Length / 1MB)) -ForeGround red
    $LogText = Get-Content $_ |
      Select-Object -Last $NewSize_Lines  #nur die letzten x Zeilen behalten
    $LogText >$_ #in Datei zurück schreiben
    Write-Host $( 'New Size: {0:F2} MB'-f ((Get-Item $_).Length / 1MB)) -ForeGround green
  }
pause

wenn Du die ersten x Zeilen behalten möchtest, ändere Zeile 10 zu:

 Select-Object -First $NewSize_Lines 

Bevor Du das Script testest, lege bitte ein Backup (Kopie) deines Logordeners an. Ich habe leider keine Möglichkeit das Script unter den Bedingungen Deines Rechners zu testen.

wenn alles bei manuellem Start funktioniert kannst Du obiges Script auch als HybridBatch im Autostartordner ausführen.

demo.cmd ( Powershellteil gekürzt)

<# : Batch Abschnitt Zeile nicht ändern
start "" /min powershell "iex (gc '%~f0' -Encoding UTF8 -Raw | out-string)"
exit /b
: #>

$WorkPath='C:\hier dein ordnerPfad'
dir -Path $WorkPath -Filter '*.log'|
  ?{$_.Length -gt 1MB} |
  %{
    $LogText = gc $_ | select -Last 1000
    $LogText >$_ 
  }
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
Myxin11 
Fragesteller
 27.03.2024, 08:37

Wow, erstmal ein Dankeschön für die Mühe :)

Ein kleiner Fehler scheint wohl noch im Script enthalten zu sein. Das Log wird gefunden, aber Get-Content wird im C:\WINDOWS\system32\eqlog_Username_Server.txt nicht gefunden.Nicht wundern, de Logfiles haben die Endung .txt.

Die Dateien liegen in D:\Everquest\Logs

Vielleicht hilft das ja.

0
Erzesel  27.03.2024, 08:51
@Myxin11

Ahhh, sorry mein Fehler hatte nur im scriptordner probiert.

und S_ gibt nint den Vollen Pfad des Objekts wieder.

Der volle Dateipfad wird mit .FullName spezifiziert. (mein Fehler)

die scripts lauten entsprechend:

$WorkPath='D:\Everquest\Logs'
$MaxSize = 1MB
$NewSize_Lines = 1000  #die neue Zielgröße in Zeilen angeben, Logs sind Zeilenorientiert!


Get-ChildItem  -Path $WorkPath -Filter '*.log'|
    Where-Object {$_.Length -gt $MaxSize} |
    Foreach-Object{
        Write-Host $( 'Found File: {0}  Size: {1:F2} MB'-f $_.Name,($_.Length / 1MB)) -ForeGround red
        $LogText = Get-Content $_.FullName|
            Select-Object -Last $NewSize_Lines   #nur die letzten x Zeilen  behalten
        $LogText >$_.FullName  #in Datei zurück schreiben
        Write-Host $( 'New Size: {0:F2} MB'-f ((Get-Item $_).Length / 1MB)) -ForeGround green
    }

pause

bzw als hybridbatch:

<# : Batch Abschnitt Zeile nicht ändern
start ""  powershell "iex (gc '%~f0' -Encoding UTF8 -Raw | out-string)"
exit /b
: #>


$WorkPath='D:\Everquest\Logs'
dir -Path $WorkPath -Filter '*.log'|
    ?{$_.Length -gt 1MB} |
    %{
        $LogText = gc $_.FullName | select -L 1000
        $LogText >$_.FullName 
    }
pause


1
Myxin11 
Fragesteller
 27.03.2024, 09:11
@Erzesel

Perfekt, so wollte ich es haben :)

Ich bin nur etwas erschrocken über die Ausgabe:

New Size: 0,00 MB

Aber es sind noch C.a. 200kb vom Log vorhanden, also ignoriere ich die Ausgabe einfach :)

0
Erzesel  27.03.2024, 09:22
@Myxin11

Hatte ich vergessen...

Write-Host $( 'New Size: {0:F2} MB'-f ((Get-Item $_.FullName).Length / 1MB)) -ForeGround green

1
Erzesel  27.03.2024, 09:25
@Myxin11

Wenn Du mehr behalten willst einfach die Anzahl der Zeilen anpassen

0

Das addon Finalscript sollte Abhilfe leisten. Im ligfile Gibt es verschiedene Daten die Anhand der zu beziffernden Menge evaluiert werden müssen. Die Installation erfordert ein komplettes vorheriges Backup und der cmd master muss in tcpip eingeführt werden. Dazu die logfiles via cmd per enter taste einführen. Ein Fenster öffnet sich in dem eingeben werden muss: cmd/Script/1/Finalscript/Backup

Myxin11 
Fragesteller
 26.03.2024, 17:10

Der Vorschlag hört sich gut an, jedoch habe ich da 2 Probleme bei...

  1. Kann ich kaum mehr Englisch
  2. Mit Programmieren stehe ich mittlerweile auch auf Kriegsfuß ^^

Ich habe dazu leider nur was in Englischen Foren gefunden, oder auf Github.

Da bin ich dann leider völlig aufgeschmissen, da ich durch meine Multiple Sklerose sehr viel an Englisch vergessen habe.

0