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-Key: 607976

Url: https://administrator.de/contentid/607976

Printed on: April 24, 2024 at 23:04 o'clock

Member: BirdyB
BirdyB Sep 26, 2020 at 12:42:21 (UTC)
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
Member: ChrisChapadia
ChrisChapadia Sep 27, 2020 at 09:43:10 (UTC)
Goto Top
Steht nicht im Namen, müsste also nach Ersteller gefiltert werden
Member: colinardo
Solution colinardo Sep 27, 2020 updated at 17:44:13 (UTC)
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
Member: ChrisChapadia
ChrisChapadia Sep 28, 2020 at 17:53:40 (UTC)
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 ;)
Member: ChrisChapadia
ChrisChapadia Oct 12, 2020 at 15:08:13 (UTC)
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.