sugram
Goto Top

PS wenn mehr als x dateien im ordner sind, diese löschen (über mehrere UNC Pfade)

Hallo

Ich möchte das in den (unter)Ordnern nur eine bestimmte Anzahl an Dateien liegen.
Also z.b 1000, wenn dann am nächsten Tag 1234 Dateien darin enthalten sind, soll er 234 Dateien löschen.

Jetzt habe ich das schon für ein Verzeichnis geschafft.

$sourceFolder = "c:\tmp"  

$keepCountPerFolder = 10

function Remove-ExcessFiles {
    param (
        [string]$folder
    )

    # Zählen der Dateien im aktuellen Verzeichnis
    $fileCount = (Get-ChildItem $folder -File).Count

    # Überprüfen, ob die Anzahl der Dateien größer als $keepCountPerFolder ist
    if ($fileCount -gt $keepCountPerFolder) {
        # Die überzähligen Dateien ermitteln
        $filesToDelete = Get-ChildItem $folder | Select-Object -First ($fileCount - $keepCountPerFolder)

        # Löschen der überzähligen Dateien
        foreach ($file in $filesToDelete) {
            Write-Host Remove-Item $file.FullName -Force
        }

        Write-Host "Löschen abgeschlossen für Verzeichnis: $folder"  
    } else {
        Write-Host "Es gibt weniger als $keepCountPerFolder Dateien im Verzeichnis $folder. Kein Löschen erforderlich."  
    }
}

# Überprüfen, ob das Quellverzeichnis existiert
if (Test-Path $sourceFolder -PathType Container) {
    # Rekursiv durch alle Unterverzeichnisse gehen und überschüssige Dateien entfernen
    Get-ChildItem $sourceFolder -Directory -Recurse | ForEach-Object {
        Remove-ExcessFiles -folder $_.FullName
    }
} else {
    Write-Host "Das angegebene Quellverzeichnis existiert nicht."  
}


Das schaut auch aktuell auch gut aus.
Wenn ich jetzt aber mehrere Pfade benötige, brauche ich eine foreach, soweit hab ich das schon verstanden, nur nicht wo ich die jetzt einfügen sollte.

ich weiß das ich so
$sourceFolder = "c:\tmp", "C:\temp"  
mehrere Pfade definieren kann und mit

foreach ($sourceFolder in $sourceFolders ) {

alle abarbeiten kann. Zumindest interpretiere ich das so.
Kann mir da jemand dabei behilflich sein?

Danke schon mal an alle

Content-ID: 4115469272

Url: https://administrator.de/forum/ps-wenn-mehr-als-x-dateien-im-ordner-sind-diese-loeschen-ueber-mehrere-unc-pfade-4115469272.html

Ausgedruckt am: 23.12.2024 um 05:12 Uhr

8030021182
8030021182 29.11.2023 aktualisiert um 17:56:26 Uhr
Goto Top
Kein Problem
$keep = 10
$folders = "c:\tmp","C:\temp"  
foreach($folder in $folders | ?{Test-Path -LiteralPath $_}){
    Get-ChildItem -LiteralPath $folder -Directory -Recurse | %{
        Get-ChildItem -LiteralPath $_.Fullname -File | sort LastWriteTime -Descending | select -skip $keep | remove-item -Force -Verbose
    }
}

Gruß Katrin
sugram
sugram 29.11.2023 um 17:20:37 Uhr
Goto Top
Also erst mal danke face-smile

Wenn ich diese Powershell ausführe, und in dem Ordner z.b 100 Files enthalten sind und ich bei keep 99 eingebe, bleibt die Anzahl bei 100.

Und dennoch würde mich das interessieren, wo ich bei meinem Script das foreach einbauen müßte.

Gruß sugram
8030021182
Lösung 8030021182 29.11.2023 aktualisiert um 17:36:09 Uhr
Goto Top
Zitat von @sugram:

Also erst mal danke face-smile

Wenn ich diese Powershell ausführe, und in dem Ordner z.b 100 Files enthalten sind und ich bei keep 99 eingebe, bleibt die Anzahl bei 100.
Nein bei 99 natürlich 🤪.

Und dennoch würde mich das interessieren, wo ich bei meinem Script das foreach einbauen müßte.
Einfach mit einer ForEach Schleife wie oben gezeigt Kapseln ....

$folders = "c:\tmp", "c:\temp"  

$keepCountPerFolder = 10

function Remove-ExcessFiles {
    param (
        [string]$folder
    )

    # Zählen der Dateien im aktuellen Verzeichnis
    $fileCount = (Get-ChildItem $folder -File).Count

    # Überprüfen, ob die Anzahl der Dateien größer als $keepCountPerFolder ist
    if ($fileCount -gt $keepCountPerFolder) {
        # Die überzähligen Dateien ermitteln
        $filesToDelete = Get-ChildItem $folder | Select-Object -First ($fileCount - $keepCountPerFolder)

        # Löschen der überzähligen Dateien
        foreach ($file in $filesToDelete) {
            Write-Host Remove-Item $file.FullName -Force
        }

        Write-Host "Löschen abgeschlossen für Verzeichnis: $folder"    
    } else {
        Write-Host "Es gibt weniger als $keepCountPerFolder Dateien im Verzeichnis $folder. Kein Löschen erforderlich."    
    }
}


Foreach ($sourceFolder in $folders){
    # Überprüfen, ob das Quellverzeichnis existiert
    if (Test-Path $sourceFolder -PathType Container) {
        # Rekursiv durch alle Unterverzeichnisse gehen und überschüssige Dateien entfernen
        Get-ChildItem $sourceFolder -Directory -Recurse | ForEach-Object {
            Remove-ExcessFiles -folder $_.FullName
        }
    } else {
        Write-Host "Das angegebene Quellverzeichnis existiert nicht."    
    }
}
sugram
sugram 29.11.2023 um 18:53:46 Uhr
Goto Top
Zitat von @8030021182:

Zitat von @sugram:

Also erst mal danke face-smile

Wenn ich diese Powershell ausführe, und in dem Ordner z.b 100 Files enthalten sind und ich bei keep 99 eingebe, bleibt die Anzahl bei 100.
Nein bei 99 natürlich 🤪.


Oh man, ich glaube ich sollte langsam Feierabend machen face-smile
Hab's erst echt nicht gepeilt.

Vielen Dank für deine Hilfe!!