none
Script zum Leeren von Temp Ordnern RRS feed

  • Frage

  • Hallo allerseits!

    Ich hab mir hier ein Script zusammengebaut, welches aus den Temp Ordnern aller lokalen Profile sowie des Systems alle Inhalte löschen soll, die älter als 30 Tage sind. Das Script wird beim Systemstart eines Clients automatisch ausgeführt. Allerdings werden irgendwie nicht alle Elemente gelöscht und vor allem sieht das für mich alles so aus, als würde ich das viel zu umständlich angehen. ;-)

    Hat jemand eine Idee, wie sich das Script optimieren ließe?

    Write-Host "* Cleanup TEMP Folder Script" -foregroundcolor Cyan
    
    Function DeleteOldFiles([string]$directory)
    {
      Get-ChildItem $directory -recurse -force -ErrorAction SilentlyContinue | Where {$_.LastWriteTime -lt (Get-Date).adddays(-30) -and -not $_.psiscontainer} |% {
        If (Remove-Item $_.fullname -force -ErrorAction SilentlyContinue) {
    	  $LogMessage = "Removing "+$_.fullname
          Write-Host $LogMessage
          Write-Eventlog -Logname Application -Source DelTemp -EventID 2005 -EntryType Information -Message $LogMessage
    	}
      }  
      
      Get-ChildItem -Path $directory -ErrorAction SilentlyContinue | ForEach-Object {
        If ($_.PSIsContainer -eq $true) {
          If ((Get-ChildItem -Path $_.FullName -ErrorAction SilentlyContinue) -eq $null) {
    		If (Remove-Item $($_.FullName) -force -ErrorAction SilentlyContinue) {
    		  $LogMessage = "Removing "+$($_.FullName)
    		  Write-Host $LogMessage
              Write-Eventlog -Logname Application -Source DelTemp -EventID 2005 -EntryType Information -Message $LogMessage
    		}
          }
        }
      }   
    }
    
    Function DeleteProfileDir([string]$directory)
    {
      Write-Host "Checking profile path" $directory
      $tempdir=$directory+"\AppData\Local\Temp"
      If (Test-Path $tempdir -ErrorAction SilentlyContinue)
      {
        Write-Host "Cleaning" $tempdir
        DeleteOldFiles($tempdir)
      }
    }
    
    New-Eventlog -Logname Application -Source DelTemp -ErrorAction SilentlyContinue
    Write-Eventlog -Logname Application -Source DelTemp -EventID 2001 -EntryType Information -Message "DelTemp Script started."
    $profiledirs=Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList' | % {Get-ItemProperty $_.pspath } | Select profileImagePath | ForEach-Object -process {DeleteProfileDir $_.ProfileImagePath}
    $wintemp=$env:Windir+"\TEMP"
    Write-Host "Cleaning" $wintemp
    DeleteOldFiles($wintemp)
    Write-Eventlog -Logname Application -Source DelTemp -EventID 2002 -EntryType Information -Message "DelTemp Script finished."
    

    Donnerstag, 28. August 2014 08:06

Antworten

  • Hallo,

    dann auf die Schnelle ein Stueck Code, welches unter C:\temp alle Dateien aelter 45 Tage loescht und danach alle Ordner die leer sind und aelter wie 45 Tage, ob man die Pruefung auch bei leeren Ordnern braucht oder nicht musst du selbst entscheiden.

    Du hast einen Ordner C:\A, darin gibt es einen Ordner B also C:\A\B. Beide enthalten keine Dateien, dann wuerde deine Loesung nur B loeschen, er prueft zuerst Ordner A, der aber nicht leer ist, weil Ordner B darin, dann prueft er B, der ist leer wird also geloescht, danach ist A leer, davon bekommt deine Loesung aber nicht mehr mit. Deshalb von unten nach oben loeschen, dann wird zuerst B geprueft und geloescht, dann erst wird A geprueft und geloescht, der ja jetzt durch die Loeschng von B leer ist.

    $Now = Get-Date
    # Dateien loeschen aelter als 45 Tage
    Get-ChildItem C:\Temp -Recurse -Force | Where-Object {$_.LastWriteTime -le $Now.AddDays(-45) -and !($_.PSIsContainer)} | Remove-Item -Force
    # alle Ordner loeschen die danach leer sind und aelter als 45 Tage
    $folders = @(Get-ChildItem C:\Temp -Recurse -Force | Where-Object { $_.PSIsContainer } | Sort-Object -Descending FullName)
    foreach ($folder in $folders) {
    	if (!(Get-ChildItem $folder.FullName -Force) -and ($folder.LastWriteTime -le $Now.AddDays(-45))) {
    		Remove-Item -Force $folder.FullName
    	}
    }

    Beste Gruesse
    brima


    Donnerstag, 28. August 2014 10:19

Alle Antworten

  • Hallo,

    kann es sein das du mit nicht geloeschten Elementen z.B.: Ordner meinst die keine Dateien enthalten, aber Unterordner die eben so nur wieder leere Unterordner enthalten.

    Das wuerde dann daran liegen das du in deinem zweiten Bloch in der Function versuchst die leeren Ordner von oben nach unten zu loeschen ...

    Das musst Du von unten nach oben machen, also die Ordner vorher entsprechend sortieren, z.B.: so

    Get-ChildItem . -Recurse -Force | Where-Object { $_.PSIsContainer } | Sort-Object -Descending FullName
    Ich wollte das in dein Script gerade einbauen, muss aber dringend weg, aber vielleicht hilft dir der Hinweis ja schon mal weiter.

    Beste Gruesse
    brima

    Donnerstag, 28. August 2014 09:12
  • Ich werde das mal probieren, auch wenn mir das große Licht da jetzt noch nicht aufgegangen ist... ;)
    Donnerstag, 28. August 2014 09:43
  • Hallo,

    dann auf die Schnelle ein Stueck Code, welches unter C:\temp alle Dateien aelter 45 Tage loescht und danach alle Ordner die leer sind und aelter wie 45 Tage, ob man die Pruefung auch bei leeren Ordnern braucht oder nicht musst du selbst entscheiden.

    Du hast einen Ordner C:\A, darin gibt es einen Ordner B also C:\A\B. Beide enthalten keine Dateien, dann wuerde deine Loesung nur B loeschen, er prueft zuerst Ordner A, der aber nicht leer ist, weil Ordner B darin, dann prueft er B, der ist leer wird also geloescht, danach ist A leer, davon bekommt deine Loesung aber nicht mehr mit. Deshalb von unten nach oben loeschen, dann wird zuerst B geprueft und geloescht, dann erst wird A geprueft und geloescht, der ja jetzt durch die Loeschng von B leer ist.

    $Now = Get-Date
    # Dateien loeschen aelter als 45 Tage
    Get-ChildItem C:\Temp -Recurse -Force | Where-Object {$_.LastWriteTime -le $Now.AddDays(-45) -and !($_.PSIsContainer)} | Remove-Item -Force
    # alle Ordner loeschen die danach leer sind und aelter als 45 Tage
    $folders = @(Get-ChildItem C:\Temp -Recurse -Force | Where-Object { $_.PSIsContainer } | Sort-Object -Descending FullName)
    foreach ($folder in $folders) {
    	if (!(Get-ChildItem $folder.FullName -Force) -and ($folder.LastWriteTime -le $Now.AddDays(-45))) {
    		Remove-Item -Force $folder.FullName
    	}
    }

    Beste Gruesse
    brima


    Donnerstag, 28. August 2014 10:19
  • Okay, logisch, jetzt klickts. ;)

    Ich vermute mal, dass meine Routine, die ständig wieder Get-Date ausführt, auch nicht so intelligent war und Performance gekostet hat. Na ich werd das mal umbauen...

    Donnerstag, 28. August 2014 11:20