none
Remove-Item Exclude aus Variable RRS feed

  • Frage

  • Hallo,

    ich habe folgendes Problem:

    ich habe ein Skript erstellt, dass bestimte Ordner löschen soll. Die Namen der Ordner werden aus einer XML-Datei ausgelesen. Aus einem Ordner sollen nur bestimmte Dateien gelöscht werden, wozu ich eine Variable aus der XML-Datei auslese und diese Variable als -Exclude Option dem Skript übergebe.

    Problem ist nun, obwohl ich die Exclude-Option richtig übergebe, diese nicht bei Remove-Item CmdLet berücksichtigt wird, somit werden alle Dateien aus dem Ordner gelöscht.

    Auszug aus XML:

    <Folder>
    <Name Value="C:\Windows\Temp" />
    <Exclude Value="'*.log','*.xml'" />
    </Folder>
    Auszug aus Skript:
    if (($_.Exclude.Value) -and (Test-Path -Path $_.Name.Value -PathType Container)){
                Remove-Item -Path $_.Name.Value -Exclude $_.Exclude.Value -Recurse -Force -WhatIf}
    Wenn ich die Zeile Remove-Item über Write-Host "zusammen baue" und separat ausführe, dann klappt es und es werden nicht alle Dateien gelöscht. Hat jemand eine Idee?

    Sonntag, 1. Juni 2014 10:54

Antworten

  • Hallo RoKO68!

    Du willst Verzeichnisse löschen, möchtest aber Dateien stehen lassen.

    Bemerkst du den Denkfehler? Verzeichnisse sind keine Dateien und umgekehrt!

    Deine Aufgabe wäre so richtig definiert:

    Du möchtest Dateien löschen und bestimmte Dateien Stehen lassen.

    Nur wenn ein Verzeichnis nach dem Datei Löschvorgang leer ist, dann wird das Verzeichnis gelöscht.

    Ungefähr so:

    # Verbose einschalten damit man sieht was gemacht wird
    $VerbosePreference = 'Continue'
    
    # Verzeichnisse aus dem 
    $Verzeichnisse = 'D:\temp\Test','D:\temp\Test1','D:\temp\Test2'
    
    ForEach($Verzeichnis in $Verzeichnisse) {
         
         Write-Verbose "Bearbeite Ordner: $Verzeichnis"
    
         # Alle Dateien löschen in dem Aktuellen rekursiv löschen (ausser die excluded Dateien)
         Get-ChildItem  -Path $Verzeichnis -Exclude '*.log','*.xml','*.png' -Recurse | Where-Object { -not  $_.PSIsContainer } | ForEach-Object {
          Write-Verbose "Lösche die Datei : $($_.Fullname)"
          Remove-Item -Path $_.Fullname -force -WhatIf
         }
         
         # leere Verzeichnisse löschen
         Get-ChildItem  -Path $Verzeichnis -Recurse | Where-Object { $_.PSIsContainer } | ForEach-Object {
          # Wenn das Aktuelle Verzeichnis leer ist wird es gelöscht
          If(@(Get-ChildItem $_.Fullname).count -eq 0) {
            Write-Verbose "Lösche das leere Verzeichnis: $($_.Fullname)"
            Remove-Item -Path $_.Fullname -force -WhatIf
          }
         }
    }




    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort vorgeschlagen Alex Pitulice Dienstag, 3. Juni 2014 11:44
    • Als Antwort markiert Alex Pitulice Mittwoch, 18. Juni 2014 13:22
    Montag, 2. Juni 2014 09:04