Jump to content
nv_it

Powershell Skript zum Löschen von Dateien die älter sind als X Tage

Recommended Posts

Hallo zusammen,

 

ich baue aktuell mal wieder ein Skript mit Powershell welches zum einen eine Bestimmte Gerätesammlung aus dem Active Directory ausliest.

Für jeden Computer in dieser Liste soll in bestimmten Pfaden sollen Dateien die älter sind als X Tage gelöscht werden.

Außerdem soll mit dem Skript auf einem Server in verschiedenen Pfaden ebenfalls Dateien die älter sind als X Tage gelöscht werden. 

Ich habe das ganze bisher so realisiert was auch an sich gut funktioniert:

$MDE = (Get-ADComputer -Filter "Name -like 'COMPUTER'").Name

$SourceMDE1 = "\\$PC\c$\XXX\XXX\"
$SourceMDE2 = "\\$PC\c$\XXX\XXX\"
$SourceMDE3 = "\\$PC\c$\XXX\XXX\"
$SourceFVS1 = "\\server\c$\XXX\XXX\"
$SourceFVS2 = "\\server\c$\XXX\XXX\"
$SourceFVS3 = "\\server\c$\XXX\XXX\"
$SourceFVS4 = "\\server\c$\XXX\XXX\"
$LogSourceMDE = "\\server\c$\XXX\XXX\"
$LogSourceFVS = "\\server\c$\XXX\XXX\"
$Days1 = 10
$Days2 = 30	
$ext = "*.bat","*.cat","*.txt","*.ini","*.zip","*.pdf","*.log"	
$logMDE = "$LogSourceMDE$(get-date -format yymmddHHmmss).txt"
$logFVS = "$LogSourceFVS$(get-date -format yymmddHHmmss).txt"
$DateBeforeXDays1 = (Get-Date).AddDays(-$Days1)
$DateBeforeXDays2 = (Get-Date).AddDays(-$Days2)

ForEach ($PC in $MDE)
{
   
    start-transcript $logMDE
    write-host "--------------------------------------------------------------------------------------"
    write-host "Löschen aller Dateien ($ext) im Ordner $SourceMDE1 $SourceMDE2 $SourceMDE3 die älter sind als $Days1 und $Days2 Tage."
    write-host "--------------------------------------------------------------------------------------"
    get-childitem $SourceMDE1\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    get-childitem $SourceMDE2\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    get-childitem $SourceMDE3\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
    stop-transcript
}
 

start-transcript $logFVS
write-host "--------------------------------------------------------------------------------------"
write-host "Löschen aller Dateien ($ext) im Ordner $SourceFVS1 $SourceFVS2 $SourceFVS3 $SourceFVS4 die älter sind als $Days1 und $Days2 Tage."
write-host "--------------------------------------------------------------------------------------"
get-childitem $SourceFVS1\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays2 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
get-childitem $SourceFVS2\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays2 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
get-childitem $SourceFVS3\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays2 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
get-childitem $SourceFVS4\* -include $ext -recurse | where {$_.lastwritetime -lt $DateBeforeXDays1 -and -not $_.psiscontainer} |% {remove-item $_.fullname -force -verbose}
stop-transcript

 

 

Jetzt hab ich leider noch ein Problem, und zwar in einem der Pfade (SourceFVS2) sind Unterordner die ich auch nach dem gleichen Schema mit löschen möchte.

Steh gerade etwas auf dem Schlauch welchen Parameter ich ändern muss damit er in diesem Pfad die Unterordner mit löscht.

Ansonsten bin ich allgemein offen für Verbesserungsvorschläge :-)

 

Vielen Dank im voraus.

Gruß Niklas

Share this post


Link to post
Share on other sites

Wir (Powershell)-Scripter schreiben nicht so gern code doppelt und dreifach. Dafür gibt es Arrays und Schleifen. Hier mal ein Beispiel, der von Deinem Code "inspiriert" wurde. Der Muss selbstverständlich noch angepasst werden.

$ComputerNameList = (Get-ADComputer -Filter Name -like 'COMPUTER').Name

$DirectoryList = @(
    'C:\xxx\xxx1'
    'C:\xxx\xxx2'
    'C:\xxx\xxx3'
)
$10DaysBefore = (Get-Date).AddDays(-10)
$30DaysBefore = (Get-Date).AddDays(-30)

foreach ($ComputerName in $ComputerNameList) {
    if (Test-Connection -ComputerName $ComputerName -Quiet -Count 1) {
        Invoke-Command -ComputerName $ComputerName {
            foreach ($Directory in $DirectoryList) {
                Get-ChildItem -Path $DirectoryList -Include *.bat, *.cat, *.txt, *.ini, *.zip, *.pdf, *.log -Recurse -Force -File |
                    Where-Object {
                        $_.LastWriteTime -lt $10DaysBefore
                    } |
                        Remove-Item -Force
            }
        }
    }
}

Wie Du siehst, ist keine CodeZeile doppelt vorhanden. Das macht den Code deutlich leichter zu lesen, zu debuggen falls nötig und auch leichter zu erweitern, falls gewünscht.  ;-)  Wenn Du z.B. ein weiteres Verzeichnis behandeln möchtest, fügst Du einfach ein weiteres Verzeichnis dem Array $DirectoryList hinzu.

 

Fragen? Fragen!  ;-) :D 

 

Edit: Achja ... noch vergessen ... der Code dürfte auch so deutlich schneller laufen, da Du die Dateien nicht über die administrativen Freigaben löschen musst, sondern quasi lokal unterwegs bist. 

Edited by BOfH_666

Share this post


Link to post
Share on other sites
9 hours ago, daabm said:

Nichts ist bei reinen Dateimanipulationen langsamer als Powershell :-)

Nur stört das oft nicht. Wenn im Betrieb Dateien in zwei oder zehn Minuten bereinigt sind, dürfte unerheblich sein.

Share this post


Link to post
Share on other sites
vor 13 Stunden schrieb Dukel:

Nur stört das oft nicht. Wenn im Betrieb Dateien in zwei oder zehn Minuten bereinigt sind, dürfte unerheblich sein.

Schon klar - nur meinte Olaf, daß sein Code deutlich schneller laufen dürfte. Da hat er - was den reinen logischen Code betrifft - vermutlich recht, aber das fällt im Verhältnis zur Lahmheit der Dateioperationen nicht wirklich ins Gewicht :-)

Share this post


Link to post
Share on other sites
vor 18 Minuten schrieb daabm:

... nur meinte Olaf,  ... aber das fällt im Verhältnis zur Lahmheit der Dateioperationen nicht wirklich ins Gewicht :-)

... dass Du mich immer so schonungslos desillusionieren musst  ... :disappointed_cry::aetsch2:

Share this post


Link to post
Share on other sites

Einer muß ja auf dem Teppich bleiben - der kehrt den dann auch ab und zu :-)

Was ich schon für Klimmzüge gemacht habe, um PSDrive-Operationen zu beschleunigen... Bis hin zum Speichern aller bereits besuchten "Verzeichnisse" in einer Hashtable, damit ich da schnell nachschauen kann, ob es existiert. Weil "nachschauen im realen PSDrive" bis zu 5 Sekunden dauerte...

Share this post


Link to post
Share on other sites

Ja, wenn's um viele Dateien geht, lohnt es doch meistens externe tools einzuspannen ... im einfachsten Fall robocopy ... könnte ja hier theoretisch auch klappen ... robocopy kann ja schließlich auch löschen. :thumb1:;-)

Share this post


Link to post
Share on other sites

Moin,

 

danke schonmal für die Tipps und Vorschläge :-)

Ich war die Tage leider etwas außer gefecht und werde mir die "bessere Version" heute mal anschauen.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


Werbepartner:



×
×
  • Create New...