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
Please also mark the comments that contributed to the solution of the article
Content-Key: 607976
Url: https://administrator.de/contentid/607976
Printed on: April 24, 2024 at 23:04 o'clock
5 Comments
Latest comment
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 , 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