Próbuję analizować wiele maili w określonym folderze pocztowym, aby ostatecznie utworzyć plik CSV z informacjami.

Jeśli uruchomię skrypt na jednym użytkowniku, wyjście, które otrzymuję, jest idealny;

Name                           Value                                                          
----                           -----                                                          
Kontor.                        HR                      
Prøvetid                       Ja                                                            
Blomster på dagen              Nej                                                            
Telefonnr.                     85789845                                                      
Adresse                        Hovedgade 13                                                  
Ansættes i stedet for          Ninette Kock                                    
Navn                           Marianne Pedersen                                                
Etage                          1. sal                                                        
Fri telefon                    Ja                                                            
Benyttet navn                  Marianne Pedersen                                                
Medarbejdertype                Fastansat                                                      
Overtagelse af mobilnr.        Ja                                                            
Placering                      Sydøst                                                        
Ansættelsesdato                01-01-2020                                                    
Stilling                       Fuldmægtig                                                    
Lokalnr.                       +45 3370 0000                                                
Besked til IT-centret                                                                        
Antal timer                    37                                                            
Journalistpraktikant           Nej                                                            
Tidl. ansat                    Nej                                                            
Initialer                      MAPE                                                          
Blomster anden dag             02-01-2020                                                    
Postnr/By                      2630 Taastrup                                              
Cpr. nr.                       XXXX

Problem polega na tym, że próbuję przeanalizować drugą pocztę, pierwsza poczta nadal będzie parsowana prawidłowo, ale druga rzuci błąd;

ConvertFrom-StringData : Data item 'Medarbejdertype' in line 'Medarbejdertype=Fastansat' is 
already defined.

Jeśli spróbuję przeanalizować drugą pocztę jako pierwszą pocztę, doskonale przeanalizuje. Problem dzieje się, gdy próbuję analizować więcej niż jeden.

Próbowałem wyczyścić taki stół skróty;

$data.clear()
clear-variable -name data
$data = @{}

Ale w jakiś sposób wydaje się, że stół hash nie jest opróżniony? Kod, którego używam:

Clear-Host
$navne = "MAJE", "ASHO"

# create an instance of Outlook 
Add-Type -AssemblyName "Microsoft.Office.Interop.Outlook"
$outlook = New-Object -ComObject Outlook.Application
$nameSpace = $outlook.GetNameSpace("MAPI")
$html = New-Object -ComObject "HTMlFile"

# Opens and save all mails in Nye Til Oprettelse in $mails.
$mails = $nameSpace.Folders.Item('hotline').Folders.Item('Indbakke').Folders.Item('@HOVSA''er').Folders.Item('@01Nye til oprettelse').Items | Select-Object -Property subject, htmlbody

# Loop over $mails, check if $navn = subject
foreach ($navn in $navne) {
    foreach ($mail in $mails) {
        if($mail | Where-Object {$_.subject -match "$Navn"}) {
            #$mail.HTMLBody
            # write data to $html, then find all <table> tags and parse that text.
            $html.IHTMLDOCUMENT2_write($mail.HTMLBody)
            $data = $html.all.tags("table") | % innertext 
            $data = $data -split '\r?\n' -match '^[^:]+:[^:]+$' -replace ':\s*', '=' -join "`n" | ConvertFrom-StringData
            $navn
            $data
            $data = @[]
           }
    }
}
0
STPE 7 grudzień 2019, 23:25

1 odpowiedź

Najlepsza odpowiedź

Dołączasz każdą wiadomość e-mail na dokument $html za pomocą $html.IHTMLDOCUMENT2_write($mail.HTMLBody), ale inicjuj go tylko raz na górze skryptu, więc za każdym razem, gdy pętle foreach ($mail in $mails) dodawasz inny E-mail do dokumentu.

Oznacza to, że po raz drugi pętla i jest Two Two e-maile w dokumencie $html i otrzymujesz błąd o zduplikowanych elementów danych w rezultacie.

Spróbuj przeprowadzić ruch $html = New-Object -ComObject "HTMlFile" wewnątrz pętla foreach, więc odczytuje:

foreach ($mail in $mails) {
    ...
    $html = New-Object -ComObject "HTMlFile"
    $html.IHTMLDOCUMENT2_write($mail.HTMLBody)
    ...
}

PS: Możesz także chcieć spojrzeć na przy użyciu biblioteki nie-com, takiej jak HTML Agility Pack do Wykonaj przetwarzanie HTML - potencjalnie będzie trochę szybsze i bardziej niezawodne (i przenośne) w skrypcie automatyzacji niż COM jest.

0
mclayton 8 grudzień 2019, 08:44