Import-Skript

  • Hi,


    ich bin gerade ein PowerShell Script am schreiben, welches automatisiert PST-Files in ein Postfach laden soll.


    Die Abfolge des kompletten Import-Vorgangs ist folgende:


    1. Import des Postfachs mit PowerShell
    2. Erstellen des Logfiles mit PowerShell


    3. Import der Mails mit Java-Programm in Archivierungssystem
    4. Löschen der Mails mit Java-Programm


    5. Deaktivieren des Postfachs mit PowerShell
    6. Erstellen eines neuen Postfachs mit PowerShell


    Weil ich bloß Schritt 1,2,4 und 6 mit der PowerShell realisieren kann, ist das Automatisieren des Vorgangs noch etwas problematisch.


    Somit muss in das Script eine Variable, in welches das Java-Programm dann Werte an das PowerShell Script übergibt.


    Diese Werte sind die Dateinamen der PST-Files.


    Das Java-Programm ruft also nach dem Auslesen des Dateinamens das PowerShell-Script auf und dieses übernimmt dann den Importvorgang.


    Zu Testzwecken fordere ich den Benutzer auf den Pfad der PST-Datei einzugeben, damit die Variable gefüllt wird.


    So sieht das Script bisher aus.


    <code>
    # Pfad-Variable wird definiert
    $pfad=""


    # Benutzer wird aufgefordert die Variable zu füllen
    $pfad = Read-Host "Bitte geben Sie den Dateipfad ein"


    # Überprüfung ob der Pfad im Filesystem mit dem eingegebenen Pfad übereinstimmt
    if ((test-path $pfad))
    {
    Write-Host "Der Pfad ist okay"


    # Inhalt des Ordners im Filesystem wird ausgelesen und in eine weitere Variable geschrieben

    $pstdaten=Get-ChildItem -Path $pfad -Name -Include *.pst


    # Schleife ruft das Import Cmdlet auf und kopiert die Log-Datei in einen anderen Ordner
    foreach ($i in $pstdaten)
    {
    # Hier tritt das Problem auf. Die Shell kann plötzlich nix mit dem Import-Cmdlet anfangen
    # und schreibt den Inhalt der Variable nicht hinter den Dateipfad
    Import-Mailbox -Identity "Migration" -PSTFolderPath "D:\PST-Import\$pstdaten" -AllowDuplicates
    Move-Item "D:\Microsoft\Exchange Server\V14\Logging\MigrationLogs\*.*" -destination "D:\PST-Import\Logs"
    }

    # Stimmt der Pfad nicht überein, gibts ne Fehlermeldung
    }
    else
    {
    Write-Host "Ungültiger Pfad" -ForegroundColor Red
    }
    </code>


    Wie auskommentiert beschrieben, kann die Shell plötzlich nix mit der Import-Anweisung anfangen.


    Ich bekomme folgende Fehlermeldung


    <code>
    Die Benennung "Import-Mailbox" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführb
    aren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), un
    d wiederholen Sie den Vorgang.
    Bei D:\PST-Import\Auto-Migration.ps1:28 Zeichen:17
    + Import-Mailbox <<<< -Identity "Migration" -PSTFolderPath "D:\PST-Import\$pstdaten" -AllowDuplicates
    + CategoryInfo : ObjectNotFound: (Import-Mailbox:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
    </code>


    Kann mir hier jemand helfen?


    P.S. Fairerweise möchte ich darauf hinweisen, dass ich bei diesem Skript Unterstützung eines Mitglieds des http://www.administrator.de und bei der Umsetzung des Import-Vorgang jede Menge Hilfe des http://www.nobbysweb.de/ Boards hatte.


    Danke an dieser Stelle :)


    Freue mich über jede Anregung.


    Grüße



    Tray :)

    • Offizieller Beitrag

    Moin,


    Du musst das Script in der Exchange-Management-Shell ausführen, in der normalen PowerShell ist das CMDLET natürlich nicht bekannt.


    Alternativ kannst Du auch den folgenden Befehl an den Anfang stellen:


    Code
    Add-PSSnapin Microsoft.Exchange.Management.PowerShell.E2010
  • Hi,


    danke für die rasche Anwort. So hat es funktioniert, das Skript auszuführen. Allerdings macht dieses an für sich noch einige Probleme.


    Ich weiß noch nicht so wirklich, wie der komplette Import am besten zu automatisieren ist.


    Wäre es nicht besser eine Batch-Datei mit ins Spiel zu bringen, welche zuerst das PowerShell-Script mit dem Import und dem Löschvorgang startet und dann das Java-Programm.


    Oder kann ich das mit der Shell automatisieren?


    Ich bin verwirrt :(


    Die Shell muss doch das selbe wie die CMD können oder?

  • Hi,


    Cool! Das funktioniert! Das Java-Programm wird aufgerufen. Nun muss nur noch meine Schleife funktionieren, die dann jede PST-Datei Stück für Stück abarbeitet.


    <code>
    # Variablen werden definiert
    $pfad=""
    $datei=""


    # Benutzer wird aufgefordert die Variable zu füllen
    $pfad = Read-Host "Bitte geben Sie den Dateipfad ein"
    $datei = Read-Host "Bitte geben Sie den Dateinamen ein"


    # Überprüfung ob der Pfad im Filesystem mit dem eingegebenen Pfad übereinstimmt
    if ((test-path $pfad))
    {
    Write-Host "Der Pfad ist okay"


    # Inhalt des Ordners und Name der PST-Datei im Filesystem werden ausgelesen und in eine weitere Variable geschrieben
    $pstdaten=Get-ChildItem -Path "D:\PST-Import\PST-Files" -Name -Include $datei
    foreach ($i in $pstdaten)
    {
    # Postfach wird deaktiviert
    Disable-Mailbox -Identity "Migration"

    # Postfach wird aktiviert
    Enable-Mailbox -Identity "Migration"

    # PST-Datei wird importiert
    Import-Mailbox -Identity "Migration" -PSTFolderPath "D:\PST-Import\PST-Files\$datei" -AllowDuplicates

    # Log-Datei wird kopiert
    Move-Item "D:\Microsoft\Exchange Server\V14\Logging\MigrationLogs\*.*" -destination "D:\PST-Import\Logs"

    # Java-Programm wird aufgerufen
    invoke-expression -command "D:\PST-Import\archivieren.jar"
    }
    # Stimmt der Pfad nicht überein, gibts ne Fehlermeldung
    }
    else
    {
    Write-Host "Ungültiger Pfad" -ForegroundColor Red
    }
    </code>


    Es muss ein Fehler in der Schleife sein. Ich kann auch nicht jedes mal den Dateinamen der PST in die Variable $datei setzen. Kann die Shell nicht irgendwie eine PST-Nach der anderen auslesen und den Dateinamen in die Variable setzen?

    • Offizieller Beitrag

    Moin,


    mir ist nicht so ganz klar, was Du nun wirklich erreichen willst.


    Du fragst oben mit "$datei = Read-Host "Bitte geben Sie den Dateinamen ein"" einen Dateinamen ab.


    In der Schleife "foreach ($i in $pstdaten)" gehst Du dann aber einen Ordner durch und nimmst alle Dateien daraus.


    Was nun?
    Eine Datei? -> Schleife überflüssig
    Alle Dateien im Ordner -> Abfrage des Dateinamens überflüssig

  • Ich möchte eine Datei nach der anderen in dem Ordner abarbeiten. Also dachte ich, dass ich der "Dateinamen-Variable" eine PST nach der anderen mitgebe.


    Also.. Alle in einem Ordner.


    Dann brauch ich die Frage nach dem Dateinamen nicht mehr?
    <code>
    $pstdaten=Get-ChildItem -Path "D:\PST-Import\PST-Files" -Name -Include *.pst
    foreach ($i in $pstdaten)
    {
    # Postfach wird deaktiviert
    # Disable-Mailbox -Identity "Migration"

    # Postfach wird aktiviert
    Enable-Mailbox -Identity "Migration"

    # PST-Datei wird importiert
    Import-Mailbox -Identity "Migration" -PSTFolderPath "D:\PST-Import\PST-Files\$datei" -AllowDuplicates

    # Log-Datei wird kopiert
    Move-Item "D:\Microsoft\Exchange Server\V14\Logging\MigrationLogs\*.*" -destination "D:\PST-Import\Logs"

    # Java-Programm wird aufgerufen
    invoke-expression -command "D:\PST-Import\archivieren.jar"
    }
    </code>
    wie gebe ich dann aber der Import-Anweisung nacheinander die ermittelten Dateinamen aus dem Ordner mit?

  • Okay,


    wenn ich das Skript ausführe, bekomm ich einen Fehler angezeigt, weil alle Dateinamen hintereinander ausgegeben werden. Also so sieht die Meldung aus:


    <code>
    Fehler: Parameter 'PSTFolderPath'. Der Pfad 'D:\PST-Import\PST-Files\Migration - Kopie (2).pst Mi
    gration - Kopie (3).pst Migration - Kopie (4).pst Migration - Kopie.pst Migration-fehler.pst Migration.pst Notes Testmi
    g-1.pst Notes Testmig.pst' ist nicht vorhanden. Bei dem Pfad muss es sich um einen vorhandenen Ordner oder um eine PST-
    Datei handeln.
    + CategoryInfo : ObjectNotFound: (:) [], RecipientTaskException
    + FullyQualifiedErrorId : 62827C7A
    </code>
    Ist ja auch klar. Woher soll er wissen, dass er nach jeder abgearbeiteten Datei die nächste nehmen soll?


    Für ihn ist das doch nur eine Auflistung oder?


    Wie sag ich ihm das?