chrischapadia
Goto Top

Dateien älter als x Tage in userspezifisches Verzeichnis kopieren via Powershell

Guten Tag,

Ich stehe momentan vor einer relativ schwierigen Aufgabe, von der ich nicht weiss wie ich an sie herangehen soll.

Also prinzipiell geht es um folgendes:

Wir haben ein Beispielverzeichnis:

C/:Dateiablage

Hierin liegen Ordner von verschiedenen Usern z.B.

hmeier
pfischer
tmüller

Daraus möchte ich alle Unterordner und Dateien die älter als x Tage sind in ein anderes Verzeichnis kopieren, jedoch in jeweils wieder userspezifisches Ordner also z.B. nach

F/:Dateiverschrottung

Hier möchte ich dann für die einzelnen User wieder Ordner erstellen in die ihre Dateien dann eben kopiert werden. Wenn diese dann in diesem Ordner wieder 14 Tage liegen sollen sie gelöscht werden.

Ich erwarte nicht, dass hier irgendwer meine Powershellhausaufgaben macht, wäre um Anhaltspunkte oder ein paar Wegweiser auch schon dankbar.

Danke
Chris

Content-ID: 607976

Url: https://administrator.de/forum/dateien-aelter-als-x-tage-in-userspezifisches-verzeichnis-kopieren-via-powershell-607976.html

Ausgedruckt am: 15.04.2025 um 15:04 Uhr

BirdyB
BirdyB 26.09.2020 um 14:42:21 Uhr
Goto Top
Moin,
erstmal solltest du mit korrekten Pfadangaben arbeiten. Du meinst bestimmt:
C:\Dateiablage
Alles andere dürfte schwierig werden.
Woher weißt du, welche Datei zu welchem
User gehört? Steht das im Namen oder geht es nach Ersteller?
VG
ChrisChapadia
ChrisChapadia 27.09.2020 um 11:43:10 Uhr
Goto Top
Steht nicht im Namen, müsste also nach Ersteller gefiltert werden
colinardo
Lösung colinardo 27.09.2020 aktualisiert um 19:44:13 Uhr
Goto Top
Servus Chris,
hier mal eine Basis auf der du dein Vorhaben aufbauen kannst (Kommentare s. Code, hoffentlich macht dir das Englisch der Kommentare nichts aus, ich switche beim Skripten im Kopf automatisch immer auf Englisch face-smile, hat aber den entscheidenden Vorteil das eine größere Clientel den Code leichter interpretieren können).
# Variables  ---------------------------
# Source folder
$basefolder = 'C:\Dateiablage'  
# backup folder
$backupfolder = 'F:\Dateiverschrottung'  
# tracking db file (saves paths of moved files and their time moved, to be able to delete them after the right amount of time)
$trackingdbpath = "$PSScriptRoot\duefiles.db"  
# files oder than this number of days get moved to the backup directory
$duemovedays = -14
# files oder than this number of days are deleted from the backup directory (date of moving in tracking db counts)
$duedeletedays = -14
# ------------------------------------------
# import tracking db to object
if (Test-Path $trackingdbpath){
    $db = Import-CSV $trackingdbpath -Delimiter ";"  
}else{
    $db = @()
}

write-host "Moving old files to backup folder ..." -F Green  
# move files older than $duedays to user specific backup folder
$movedfiles = ls $basefolder -File -Recurse -Force | ?{$_.LastWriteTime -lt (get-date).AddDays($duemovedays)} | %{
    $owner = (get-acl $_.Fullname).Owner.split("\")[-1]  
    $targetfolder = join-path $backupfolder (join-path $owner ($_.DirectoryName -replace [regex]::Escape($basefolder)))
    if (!(Test-Path $targetfolder)){md $targetfolder -Force | out-null}
    try{
        move-item $_.FullName -Destination $targetfolder -Force -Verbose -EA Stop 
        [pscustomobject]@{FullName = (join-path $targetfolder $_.Name); DateTimeMoved = get-date -F u}
    }catch{
        Write-Error -Message $_.Exception.Message
    }
}

# remove empty directories older then duedays in base folder
write-host "Removing old empty directories from source ..." -F Green  
ls $basefolder -Recurse -Directory -Force | ?{$_.LastWriteTime -lt (get-date).AddDays($duemovedays) -and !(ls $_.FullName -Recurse -Force)} | sort {$_.FullName.length} -Descending | del -Recurse -Force -Verbose

# remove due files from backup folder
write-host "Removing old files from backup directory ..." -F Green  
$duefiles = $db | ?{[datetime]$_.DateTimeMoved -lt (get-date).AddDays($duedeletedays)} 
$duefiles | %{del $_.Fullname -Force -EA SilentlyContinue -Verbose}

# update tracking db
# remove removed files from db
if ($db -and $duefiles){
    $db = Compare $db $duefiles -Property FullName,DateTimeMoved -PassThru | select FullName,DateTimeMoved
}
# add new moved files
if ($movedfiles){
    $db += $movedfiles
}
# write back tracking db
if ($db){
    write-host "Updating tracking database." -F Green  
    $db | export-csv $trackingdbpath -Delimiter ";" -NoType -Encoding UTF8  
}
write-host "Finished." -F White -B Blue  
Grüße Uwe
ChrisChapadia
ChrisChapadia 28.09.2020 um 19:53:40 Uhr
Goto Top
Moin Uwe

Script macht was es soll, vielen herzlichen Dank.
Mit Englisch komm ich grade so klar, bin aus der 5. Klasse raus ;)
ChrisChapadia
ChrisChapadia 12.10.2020 um 17:08:13 Uhr
Goto Top
Hallo Uwe,

kleines Update:

die Namenszuordnung müssen wir anders machen, da manche Ordner nicht direkt von den Usern erstellt wurden und daher dann den falschen zugeordnet werden.

Glücklicherweise heißen die Ordner genau wie die User. Also der ordner pmüller gehört auch dem User pmüller.