none
Outlook - Script liest nicht alle Mails (Schleifenproblem) RRS feed

  • Frage

  • Hallo Community,

    ich bekomme ein Problem nicht in den Griff, hoffe jemand kann mir behilflich sein.

    Aus einem Verzeichnis verschiebe ich Dateien in ein Archiv-Verzeichnis.

    Handelt es sich um eine verschlüsselte Mail (ich prüfe ob HTMLBody NULL ist), dann tue nichts, da zum Verschieben sowieso keine Rechte vorhanden sind.

    Handelt es sich NICHT um eine verschlüsselte Mail, verschiebe diese in Archiv-Verzeichnis.

    PROBLEM: Das Script denkt irgendwann, es ist fertig, d.h. es befinden sich keine Mails mehr im Verzeichnis, obwohl das nicht stimmt. 

    Wie kann ich das Verzeichnis aktualisieren, damit es alle Mails liest und bei jedem Schleifendurchlauf weiß, welche die nächste Mail ist?

    Code:

    $FolderInbox = 6
    $objOutlook = New-Object -comobject outlook.application
    $objMailbox = $objOutlook.GetNamespace(“MAPI”)
    $inbox = $objMailbox.GetDefaultFolder($FolderInbox)
    $targetfolder = $inbox.Folders | Where-Object { $_.Name -eq "test_powershell" }
    $archivefolder = $inbox.Folders | Where-Object { $_.Name -eq "test_powershell_archiv" }
    
    $Counter = $targetfolder.ShowItemCount
    $ItemsCount = $targetfolder.Items.Count
    Write-Host $ItemsCount
    
    foreach($item in $targetfolder.Items) {
        if($ItemsCount -gt 0) {
            if($item.HTMLBody) {
                foreach($attachement in $item.attachments) {
                    Write-Host $attachement.filename
                
                    if(!$attachement.filename) {
                        Write-Host FileName leer
                    }
                    elseif ($attachement.filename -match  "(.jpg|.log)") {
                        
                        Write-Host FileName stimmt mit Exclude-Regex überein
                    
                    }
                    else {
                       
                        Write-Host FileName stimmt NICHT mit Exclude-Regex überein
        
                    }
                }  
                $item.Move($archivefolder)
                $ItemsCount--
            }
            else {
                $ItemsCount--
            }
        }
    }

    Jemand eine Idee?

    Das einzige was mir einfällt ist, die Mails in einen Array zu stecken und dann

    - falls verschlüsselt, Index ++

    - falls unverschlüsselt, Index bleibt (da Mail verschoben wird und nächste Mail an den aktuellen Index verschoben wird)

    beste Grüße

    Dienstag, 18. November 2014 10:53

Antworten

  • Hallo Alzenberg!

    Wenn man eine Liste (ein Array) mit der ForEach() Schleife durchläuft, darf die Anzahl der Items in der Liste nicht verändert werden, da dadurch der interne Index Zähler von ForEach nicht mehr stimmt.

    Dein Zähler $ItemsCount macht hier auch wenig sinn.

    Wenn man ein Array bearbeiten will während man die Anzahl verändert, muss man meistens das Array von unten nach oben durcharbeiten, damit der Index immer richtig bleibt.
    Hierzu benutzt man eine For() Schleife die rückwärts Zählt.

    $FolderInbox = 6
    $objOutlook = New-Object -comobject outlook.application
    $objMailbox = $objOutlook.GetNamespace('MAPI')
    $inbox = $objMailbox.GetDefaultFolder($FolderInbox)
    
    $targetfolder = $inbox.Folders | Where-Object { $_.Name -eq 'test_powershell' }
    $archivefolder = $inbox.Folders | Where-Object { $_.Name -eq 'test_powershell_archiv' }
    
    $Counter = $targetfolder.ShowItemCount
    $ItemsCount = $targetfolder.Items.Count
    Write-Host $ItemsCount
    
    
    for ($i = ($targetfolder.Items); $i -gt 0 ; $i--) { 
        Write-Host "Item Nummer: $i" -ForegroundColor Magenta
        $item = $targetfolder.Items.Item($i)
        if($item.HTMLBody) {
          Write-Host 'Item mit HTML Body!' -ForegroundColor Green
        }
    }

    P.S: Text (z.b. bei Write-Host) in der PowerShell muss man nicht in Anführungszeichen setzen, es vermeidet aber eventuelle Fehler und  ist deshalb dringend empfohlen! (Außerdem ist das ein guter Code style und best-practice!)


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 18. November 2014 14:11

Alle Antworten

  • Hallo Alzenberg!

    Wenn man eine Liste (ein Array) mit der ForEach() Schleife durchläuft, darf die Anzahl der Items in der Liste nicht verändert werden, da dadurch der interne Index Zähler von ForEach nicht mehr stimmt.

    Dein Zähler $ItemsCount macht hier auch wenig sinn.

    Wenn man ein Array bearbeiten will während man die Anzahl verändert, muss man meistens das Array von unten nach oben durcharbeiten, damit der Index immer richtig bleibt.
    Hierzu benutzt man eine For() Schleife die rückwärts Zählt.

    $FolderInbox = 6
    $objOutlook = New-Object -comobject outlook.application
    $objMailbox = $objOutlook.GetNamespace('MAPI')
    $inbox = $objMailbox.GetDefaultFolder($FolderInbox)
    
    $targetfolder = $inbox.Folders | Where-Object { $_.Name -eq 'test_powershell' }
    $archivefolder = $inbox.Folders | Where-Object { $_.Name -eq 'test_powershell_archiv' }
    
    $Counter = $targetfolder.ShowItemCount
    $ItemsCount = $targetfolder.Items.Count
    Write-Host $ItemsCount
    
    
    for ($i = ($targetfolder.Items); $i -gt 0 ; $i--) { 
        Write-Host "Item Nummer: $i" -ForegroundColor Magenta
        $item = $targetfolder.Items.Item($i)
        if($item.HTMLBody) {
          Write-Host 'Item mit HTML Body!' -ForegroundColor Green
        }
    }

    P.S: Text (z.b. bei Write-Host) in der PowerShell muss man nicht in Anführungszeichen setzen, es vermeidet aber eventuelle Fehler und  ist deshalb dringend empfohlen! (Außerdem ist das ein guter Code style und best-practice!)


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 18. November 2014 14:11
  • Vielen vielen Dank Herr Kriegel!

    Hat super funktioniert!

    Beste Grüße

    Eduard

    Freitag, 28. November 2014 13:05