Mailconverter und Filename-Spielereien

Vor einigen Wochen stand ich vor der Herausforderung, eine Extraktion aus einem proprietären Filearchivsystem eines Herstellers mit zwei Buchstaben auf einem normalen Fileshare bereitzustellen.
Was war archiviert?
Das Archivsystem hat jede Datei die archiviert wurde an eine E-Mail angehängt und in einem Mailarchiv abgelegt. Die Extraktion brachte mir zwei Files:

EINDEUTIGE-ID.info – Textdatei mit Infos zum Archivierer und ursprünglichem Pfad zur Archivdatei
EINDEUTIGE-ID.data – EML-Datei mit eingebettetem Anhang

Damit nicht jedes der mehreren 1000 archivierten Files manuell geöffnet und abgespeichert werden müssen, habe ich mir ein Script gebastelt, welches diese Aufgabe übernimmt.

Als erstes wird aus dem Namen der extrahierten Dateien der Name der ID ausgelesen und in eine Variable zur weiteren Verwendung zwischengespeichert. Aus der INFO-Datei wird der Speicherpfad und der Dateiname des Anhangs ausgelesen, um anschließend aus der DATA-Datei, welche eigentlich eine EML-Datei ist, mittels des Tools mailconverter den Anhang zu extrahieren und auf dem Speicherpfad bereitzustellen.
Als „kleines“ Errorhandling habe ich noch einen Schleife eingebaut, welche das vorhandensein des extrahierten Files prüft und nach einer bestimmten Zeit einen Fehkler ausgibt, wenn das File nicht vorhanden ist bzw. nicht extrahiert werden kann. Beim eingesetzten Archivsystem leider keine Seltenheit und daher notwendig.

Das komplette Script:

# Extraktion des HP-Filearchivs mittels HP-Export und mailconverter.
# 1. Schritt: Export aller Archivfiles mit acamigrate.pl aus der IAP in einen Ordner.
# 2. Schritt: Extraktion des Attachments der EML-Datei (archiviertes File) mittels mailconverter in den Ordner der in der .info Datei hinterlegt ist.

# Variablen festlegen
$source = "\files"
$target = "\files\Archiv"
$temptarget = $target+"temp"
$pathtoconverter = "\mailconverter"

# Dateien einlesen, File-ID einlesen
foreach ($filename in Get-ChildItem -Path $source -Filter *.data | select -expand name)
    {
    $iap_fileid = $filename.TrimEnd(".data")
    $iap_fileinfo = $iap_fileid + ".info"
   
    $infopath = $source + $iap_fileinfo
   
    # Speicherpfad auslesen
    $iapfilepath = Select-String -path $infopath -pattern "ConnectorLocation:"
    $iapfilepath_trim = $iapfilepath.Line.Substring(46)
    $iapfilepath_new = $target + $iapfilepath_trim
   
    # Dateiname auslesen
    $iapfilename = Select-String -path $infopath -pattern "ConnectorSubject:"
    $iapfilename_trim = $iapfilename.Line.Substring(18)
    $iapfilename_new = $iapfilename_trim
   
    # Verzeichnis erstellen
    New-Item -Path $iapfilepath_new -ItemType directory -ForceM
   
    # .data in .eml umbennenen für Extrakt
    Rename-Item $source$filename $iap_fileid".eml"
    $iap_fileid_eml = $iap_fileid+".eml"
   
    # Extrahieren
    $datasource = $source+$iap_fileid_eml
    & $pathtoconverter\mailconverter.exe $datasource $temptarget -attach
   
    # Prüfen ob Datei exisitiert
    $sleepfile = 0
    do
        {
         $sleepfile++
         Start-Sleep 1
         Write-Host "Check FileeExist $iapfilename in $filename - Loop $sleepfile"
         if ($sleepfile -gt 600)
             {
              Write-Host "Fehler bei Extraktion von $iapfilename in $filename"
              break
             }
        } while ((Test-Path $temptarget$iapfilename_new) -eq $false)
   
   
    # Verschieben an Ursprungsort
    Move-Item $temptarget$iapfilename_new $iapfilepath_new
    Remove-Item $temptarget*
    }

Comments are closed.