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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
5 Kommentare
Neuester Kommentar
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
, hat aber den entscheidenden Vorteil das eine größere Clientel den Code leichter interpretieren können).
Grüße Uwe
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
# 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