immerkind
Goto Top

PowerShell: Logfiles nach der 7ten Version verschieben

Hallo zusammen

Ich stehe an einem kleinen Problem. Ich will meine Logfiles nach der 7ten Version auf meine Festplatte speichern. Ich habe 14 Ordner mit verschiedenen Logfiles und ich will nicht jeden Ordner angeben.
Mit Get-ChildItem habe ich alle Logfiles anzeigen können und jetzt würde ich gerne nur die älteren sehen. Somit sollte es in den 14 verschiedenen Ordner nur max. 7 Logfiles haben.

Get-ChildItem Befehl:

Get-ChildItem -Path $scanlogfolder -Include *.log -Recurse

Ich habe mir überlegt das die Variabel $scanfolder evtl. änder und von Ordner zu Ordner springt und die Dateien dann so verschiebt. Jedoch komme ich nicht weiter.

Ich hoffe jemand versteht wo ich stecken bleibe und kann mir evtl. einen kleinen Tipp geben. Ich brauche keine ganze Lösung, einen Tipp währe schon sehr hilfreich.

Gruss

ImmerKind

Content-Key: 308004

Url: https://administrator.de/contentid/308004

Printed on: April 26, 2024 at 03:04 o'clock

Member: colinardo
Solution colinardo Jun 23, 2016 updated at 10:29:49 (UTC)
Goto Top
Hallo Immerkind,
für solche Fälle eignet sich das CMDLet group-object hervorragend.
(p.s. Damit lassen sich ziemlich verrückte Dinge anstellen und Gruppierungen auch anhand von Teilen von Dateieigenschaften durchführen, musst du dir unbedingt mal ansehen was damit alles möglich ist. Ich zumindest nutze es sehr häufig.)
gci 'C:\Ordner\*.log' -recurse -file | group DirectoryName | %{$_.Group | sort LastWriteTime -Descending |  select -Skip 7 | move-item -Destination 'C:\Backup\Ablage'}  
Erläuterung:
Zuerst holst du dir eine Liste aller Logfiles welche du dann per group-object anhand der Eigenschaft DirectoryName der Dateien gruppierst.
Daraus ergibt sich dann ein Objekt das alle Ordner und deren beinhalteten Log-Dateien in der Eigenschaft Group als Array enthält. Für jedes Gruppenobjekt (Ordner) sortierst du nun das Array $_.Group absteigend nach LastWriteTime und überspringst 7 Versionen die ja beibehalten werden sollen. Die dann noch eventuell verbleibenden Logs werden dann per move-item in einen Zielordner verschoben.

Hoffe ich habe das so richtig interpretiert.

Grüße Uwe
Member: ImmerKind
ImmerKind Jun 23, 2016 at 10:57:14 (UTC)
Goto Top
Hallöle Uwe

Vielen Dank für deinen Vorschlag, hilft mir riesig. Habe es gerade ein paar mal getestet und werde es ich das definitive Skript einbinden.
Eine kleine Frage hätte ich noch, vielleicht kannst du sie ja auch beantworten.
Ist es möglich, dass er die Ordnerstruktur mitkopiert und diese im Zielordner platziert. Somit könnte ich später unterschieden welche Logs von wessen Ordner sind?

Nochmals vielen Dank face-smile

Grüsse ImmerKind
Member: colinardo
Solution colinardo Jun 23, 2016 updated at 11:22:38 (UTC)
Goto Top
Zitat von @ImmerKind:
Ist es möglich, dass er die Ordnerstruktur mitkopiert und diese im Zielordner platziert. Somit könnte ich später unterschieden welche Logs von wessen Ordner sind?
Ja das kannst du ganz einfach machen, Du nimmst dir in der Schleife den Pfad des Ordners und ersetzt darin den Teil des Quellordners mit dem Pfad des Zielordners. Diesen neu zusammengesetzten Pfad prüfst du mit Test-Path ob er schon existiert und wenn nicht, erstellst du den Ordner vor dem Verschiebevorgang.
$quelle = 'C:\Ordner'  
$ziel = 'C:\Backup'  
gci $quelle -Filter *.log -recurse -file | group DirectoryName | %{
    $dest = $_.Name.replace($quelle,$ziel)
    if (!(Test-Path $dest)){md $dest -Force}
    $_.Group | sort LastWriteTime -Descending | select -Skip 7 | move-item -Destination $dest
}