fabkstn
Goto Top

Datenarchivierungssoftware gesucht

Hallo zusammen,

ich bin derzeit auf der Suche nach einer Software, mit der es möglich ist automatisiert
Dateien, welche älter als X Jahre/Monate sind, auf ein externes Storage zu verschieben/archivieren.

Das Ganze soll so ablaufen:

Die Software scannt das Hochverfügbarkeitslaufwerk nach Dateien, die eine gewisse Zeit lang
nicht angefasst wurden. Diese Dateien werden dann auf ein anderes Laufwerk verschoben/archiviert,
und es soll ein Shortcut am Originalort erstellt werden, durch welchen man auf das Archivlaufwerk
weitergeleitet wird (damit trotzdem noch auf alle Dateien ohne Probleme zugegriffen werden kann).

Hat jemand von euch so etwas schon einmal eingerichtet?

Wenn ja, habt ihr Vorschläge was für eine Software man dafür benutzen könnte?

Es soll keine Kombination aus Hard- und Software sein, die Hardware habe ich bereits,
fehlt also nur die Software.


Zusammengefasst, das sind die Kriterien bzw. Anforderungen:

Gesucht ist eine Software, die ich so konfigurieren kann, dass:

- 1x die Woche ein/oder mehrere Laufwerke gescannt werden
- erkannt wird welche Dateien seit X Monaten nicht mehr berührt wurden
- alte Dateien auf ein anderes Storage (das Archivlaufwerk) verschiebt werden
- an der Stelle, wo die Dateien ursprünglich lagen, eine Verknüpfung erstellt wird, durch die man zum Archiv weitergeleitet wird

- Das Ganze soll vollautomatisch passieren, ohne, dass man 1x die Woche einen Scan starten muss..


Danke euch im Voraus!

Content-Key: 265015

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

Printed on: April 19, 2024 at 21:04 o'clock

Mitglied: 114757
Solution 114757 Mar 02, 2015, updated at Mar 03, 2015 at 13:32:35 (UTC)
Goto Top
Moin,
das lässt sich einfach mit Powershell realisieren. Einfach nach Files älter als x Monate filtern, dann diese Files verschieben und mit der Win32 Funktion CreateSymbolicLink durch einen Softlink ersetzen.
Scriptingaufwand keine 20 Minuten ...
Das ganze dann in den Taskplaner gepackt und jede Woche einmal automatisch ausgeführt.

Gruß jodel32
Member: colinardo
Solution colinardo Mar 03, 2015 updated at 13:32:18 (UTC)
Goto Top
Zitat von @114757:
das lässt sich einfach mit Powershell realisieren. Einfach nach Files älter als x Monate filtern, dann diese Files
verschieben und mit der Win32 Funktion CreateSymbolicLink durch einen Softlink ersetzen.
Scriptingaufwand keine 20 Minuten ...
Das ganze dann in den Taskplaner gepackt und jede Woche einmal automatisch ausgeführt.
Hallo fabkstn,
um dem ganzen dann mal etwas Form anhand von Code zu verleihen, hier eine mögliche Powershell-Variante für dein Vorhaben:
(In Zeilen 1-8 legt man die Variablen fest Quell-Ordner/Archiv-Ordner/Tage nach denen archiviert wird)
Für das ermitteln der Aktivität wird im Beispiel das Änderungsdatum der Dateien herangezogen.
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# Quell Ordner
$quelle = '\\server\quelle'  
# Archiv-Ordner
$ziel = '\\storage\archiv'  
# Dateien älter als X Tage archivieren
[int]$olderthan = 365
# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
# Funktion zum erstellen eines symbolischen Links
function New-Softlink {
    param
    (
        [Parameter(Mandatory=$true)]$symlinkpath,
        [Parameter(Mandatory=$true)]$targetpath,
        [Parameter()][switch]$dir
    )
    $code = '  
            [DllImport("Kernel32.dll")]  
            public static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags);
    '  
    Add-Type -MemberDefinition $code -Name Links -Namespace Utils 
    if ($dir){$type = 1}else{$type= 0}
    [Utils.Links]::CreateSymbolicLink($symlinkpath,$targetpath,$type) | out-null
} 
# log arrays
$log = @(); $errorlog = @()

# Ziel-Ordner erstellen falls nicht existiert
if(!(Test-Path $ziel)){md $ziel -Force | out-null}

# Quelle rekursiv nach älteren Dateien druchsuchen
dir $quelle -Recurse | ?{!$_.PSIsContainer -and $_.LastWriteTime -lt (get-date).AddDays(-$olderthan)} | %{
    $origPath = $_.FullName
    # Zielpfad erstellen
    $targetFilePath = $origPath.Replace($quelle,$ziel)
    # Zielpfad im Archiv
    $targetPath = Split-Path $targetFilePath -Parent
    # Zielordner erstellen falls noch nicht existiert
    if(!(Test-Path $targetPath)){md $targetPath -Force | out-null}
    Try{
        # Datei verschieben
        move-item $origPath $targetFilePath -Force -ErrorAction Stop
        # Symlink zur Datei erstellen
        New-Softlink $_.Fullname $targetFilePath
        $log += new-Object PSObject -Property @{"Quellpfad"=$origPath;"Zielpfad"=$targetFilePath;}  
    }catch{
        $errorlog += new-Object PSObject -Property @{"Quellpfad"=$origPath;"Zielpfad"=$targetFilePath;"Fehler"=$_.exception.message}  
    }
    
}
if ($log){
    write-host "Folgende Dateien wurden archiviert und durch einen symbolischen Link ersetzt:" -ForegroundColor Green  
    $log | ft -AutoSize -Wrap
}else{
    write-host "In diesem Durchlauf wurden keine Dateien archiviert." -ForegroundColor Yellow  
}
if ($errorlog){
    write-host "Bei folgenden Dateien ist ein Fehler beim Archivieren aufgetreten" -ForegroundColor Red  
    $errorlog | ft -AutoSize -Wrap
}
Der Code hegt keine Ansprüche auf Vollständigkeit. Benutzung erfolgt wie immer auf eigene Gefahr.

Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate


Für den Fall das du noch nie etwas mit Powershell zu tun hattest und nicht weißt wie man damit umgeht und diese startet, hier noch eine kurze Einweisung:

back-to-topAnleitung: Wie starte ich Powershell-Scripte
  • Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1.
  • Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eine Powershell-Konsole und gibt dort den Befehl Set-ExecutionPolicy RemoteSigned -Force ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden: Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
  • Jetzt kann das Powershell-Script wie weiter unten erläutert in einer Powershell-Konsole oder aus einer CMD-Fenster heraus ausgeführt werden. Wer lieber mit der Maus arbeitet macht einen Rechtsklick auf die Script-Datei und wählt: Mit Powershell ausführen.
  • Alternativ lässt sich ein Script auch ohne das globale Ändern der ExecutionPolicy ausführen indem man die Policy als Parameter auf der Kommandozeile mitgibt:
powershell.exe -ExecutionPolicy RemoteSigned -File "C:\Pfad\Script.ps1"
back-to-topStarten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:
"C:\Pfad\script.ps1"
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
.\script.ps1
back-to-topStarten von PS-Scripten aus Batch und Kommandozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!
Der einfachste Aufruf sieht hier so aus:
powershell.exe -File "C:\Pfad\Script.ps1"
Wenn man dem Script Parameter übergeben möchte:
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
Man kann auch mehrere Scripte hintereinander ausführen lassen:
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
Weitere Parameter zeigt einem ein powershell -? in einer Konsole an.
back-to-topStarten von PS-Scripten in der Aufgabenplanung (Taskplaner)
In der jeweiligen Aktion unter "Programm/Script" trägt man powershell.exe ein und unter "Argumente hinzufügen (optional)" trägt man wie oben geschrieben alles was hinter powershell.exe kommt ein - also z.B. -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Member: fabkstn
fabkstn Mar 03, 2015 at 10:16:55 (UTC)
Goto Top
Hallo colinardo!

Danke, ich hätte mich erst mit Powershell anfreunden müssen, um sowas zu programmieren face-smile

Ich werds mal ausprobieren und mich hier nochmal melden face-smile

Gruß, Fabian
Mitglied: 114757
114757 Mar 03, 2015 updated at 10:43:03 (UTC)
Goto Top
@colinardo Hut ab face-wink , genau so hab ich's mir auch vorgestellt...

Gruß jodel32
Member: fabkstn
fabkstn Mar 03, 2015 at 11:38:03 (UTC)
Goto Top
Funktioniert einwandfrei!!!

Vielen Dank!!! face-smile
Member: colinardo
colinardo Mar 03, 2015 updated at 11:45:40 (UTC)
Goto Top
Zitat von @fabkstn:
Funktioniert einwandfrei!!!
Vielen Dank!!! face-smile
Freut mich face-smile

Grüße Uwe
Member: fabkstn
fabkstn Mar 03, 2015 at 11:51:09 (UTC)
Goto Top
Was ich mich nun frage ist, könnte man theoretisch auch noch einbauen, dass die Log bzw. das Protokoll
per Mail versendet wird, über den firmeninternen Mailserver? face-smile
Member: colinardo
Solution colinardo Mar 03, 2015 updated at 18:17:10 (UTC)
Goto Top
Zitat von @fabkstn:
Was ich mich nun frage ist, könnte man theoretisch auch noch einbauen, dass die Log bzw. das Protokoll
per Mail versendet wird, über den firmeninternen Mailserver? face-smile
klar. Send-Mailmessage

Kannst du das hier an das Script anhängen ... Details des Servers / Username / Password etc. natürlich anpassen:
$mailbody = @"  
<style type="text/css">  
body,td,h3{font-family:Arial, Helvetica, sans-serif;}
</style>
<h3>Archivierte Dateien</h3>
$($log | ConvertTo-Html -Fragment)
<h3>Aufgetretene Fehler</h3>
$(if ($errorlog){$errorlog | ConvertTo-Html -Fragment}else{"Keine"})  
"@  

Send-MailMessage -From "user@domain.de" -to "empfaenger@domain.de" -Subject "Archivierungslog" -Body $mailbody -BodyAsHtml -SmtpServer smtp.domain.de -Credential (New-Object PSCredential("USERNAME",(ConvertTo-SecureString 'PASSWORD' -AsPlainText -Force))) -UseSSL