ConvertFrom-StringData 清除哈希-table

ConvertFrom-StringData clear hash-table

我正在尝试解析特定邮件文件夹中的多封邮件,以最终创建包含该信息的 csv 文件。

如果我运行一个用户的脚本,我得到的输出是完美的;

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

问题是当我尝试解析第二封邮件时,第一封邮件仍能正确解析,但第二封邮件会抛出错误;

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

如果我尝试将第二封邮件作为第一封邮件来解析,它将完美解析。 当我尝试解析多个时出现问题。

我试过像这样清除散列-table;

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

但是hash-table好像没有被清空? 我使用的代码:

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 = @[]
           }
    }
}

您使用 $html.IHTMLDOCUMENT2_write($mail.HTMLBody) 将每封电子邮件附加到 $html 文档,但您只在脚本顶部初始化一次,因此每次 foreach ($mail in $mails) 循环您添加另一个 电子邮件到文档。

这意味着第二次循环迭代时 $html 文档中有 两封 封电子邮件,因此您收到有关重复数据项的错误。

尝试将 $html = New-Object -ComObject "HTMlFile" 移动到 您的 foreach 循环中,使其显示为:

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

P.S.: 你可能还想看看使用像 HTML Agility Pack 这样的非 COM 库来做你的 html 处理——它可能会更快一些并且在自动化脚本中比 COM 更可靠(和可移植)。