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 更可靠(和可移植)。
我正在尝试解析特定邮件文件夹中的多封邮件,以最终创建包含该信息的 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 更可靠(和可移植)。