嘗試從文本檔案中檢索新的用戶資訊,以創建一個域用戶,其名字和姓氏不是中間名,以及來自文本檔案的電子郵件地址。該檔案實際上是一個 .eml 檔案,因此該文本檔案還有更多內容,但這只是檔案的底部,但其格式始終相同。我在下面列出了一個示例。我需要將這些專案提取到變數 $Fname、$Lname 和 $Eaddr。我需要了解的是如何首先搜索特定行,在本例中為“BILLING ADDRESS”,然后將第 2 行向下抓取并將名字和姓氏放入上述變數中??。電子郵件地址是相同的情況,但鍵入“Congratulations on the sale”。并向上移動。不能只從“BILLING ADDRESS”算起,因為可能有一個額外的地址行,比如 apt 或套件。名稱行中也可能有一個中間名,因此腳本需要解決這種可能性,例如第二個地址行。以下是文本示例。它是檔案底部的內容,并且始終是相同的格式。
----------------------------------------
BILLING ADDRESS
Joe Some Blow
123 Nowhere
Someplace, TX 75075
joeblow@nowhere.org
----------------------------------------
Congratulations on the sale.
----------------------------------------
$path = "C:\Program Files (x86)\hMailServer\Data\theserver.com\autobot\B0"
$GETemail = (Select-String -Path "$path\*.eml" -Pattern '(^\W*.*@.*\.{1,}\w*$)' | Select-Object -ExpandProperty Line)
select-string -pattern "@" -InputObject $PREaddr -raw
$PREaddr = (Select-String -Path "$path\*.eml" -Pattern 'BILLING ADDRESS' -CaseSensitive -Context 0, 7) | Select-Object -Skip 3
$GETemail = Select-String -Pattern '(^\W*.*@.*\.{1,}\w*$)' | Select-String -Path "$path\*.eml" -Pattern 'BILLING ADDRESS' -CaseSensitive -Context 0, 7
#Using Regex to pull email addresses
$file = Get-Content "location of file"
(Select-String -InputObject $file -Pattern '\w @\w \.\w ' -AllMatches).Matches | select value
$GETemail = (Select-String -Path "$path\*.eml" -Pattern 'BILLING ADDRESS' -CaseSensitive -Context 0, 7) | Select-String -Pattern '\w @\w \.\w '
$file = Get-Content "C:\Program Files (x86)\hMailServer\Data\theserver.com\autobot\B0\*.eml"
(Select-String -InputObject $file -Pattern '\w @\w \.\w ' -AllMatches).Matches | select value
$GETemail = Select-String -Path "$path\*.eml" -Pattern 'BILLING ADDRESS' -CaseSensitive -Context 0, 7 | Select-String -Pattern '(^\W*.*@.*\.{1,}\w*$)'
Get-Item -Path "$path\*.eml" | Get-Content -Tail -2
Select-String -Path "$path\*.eml" -Pattern 'BILLING ADDRESS' -CaseSensitive -Context 0, 2 | select-object Line | ft -HideTableHeaders
Select-String -Path "$path\*.eml" -Pattern 'Congratulations' -CaseSensitive -Context 5, 0 | select-object Line | ft -HideTableHeaders
Select-String -Path "$path\*.eml" -Pattern 'BILLING ADDRESS' -CaseSensitive -Context 0, 2 | select-object -Skip 1
uj5u.com熱心網友回復:
好的,我將分解我的評論。我評論中的代碼:
gci $path\*.eml|%{gc $_ -raw|?{$_ -match '(?ms)BILLING ADDRESS\s (\S. ?)[\r\n]. ?[\r\n](\S @\S )'}|%{[pscustomobject]@{FirstName=$Matches[1].split(' ')[0];LastName=$Matches[1].Split(' ')[-1];Email=$Matches[2]}}
我將首先定義我用來在評論中保持簡短的各種別名:
gci -> Get-ChildItem
% -> ForEach-Object
gc -> Get-Content
? -> Where-Object
格式化得更好一點,不使用別名,它看起來像這樣:
Get-ChildItem $path\*.eml|
ForEach-Object{
Get-Content $_ -raw |
Where-Object{$_ -match '(?ms)BILLING ADDRESS\s (\S. ?)[\r\n]. ?[\r\n](\S @\S )'}|
ForEach-Object{
[pscustomobject]@{
FirstName=$Matches[1].split(' ')[0];
LastName=$Matches[1].Split(' ')[-1];
Email=$Matches[2]
}
}
}
這以 開頭Get-ChildItem,而這只是在定義的路徑中搜索 *.eml $path。那里沒有什么超級復雜的,繼續前進。
接下來我們打了一個ForEach-Object回圈。我實際上在這里運行了兩個回圈,一個嵌套在另一個回圈中,因此對于外部回圈,我們關心的是在找到檔案時一次處理一個檔案。因此,對于每個檔案,它所做的第一件事是:
Get-Content $_ -raw
該命令獲取作為多行字串傳遞給它的檔案的內容。這使我們可以一次搜索匹配整個電子郵件的多個組,這就是我們在下一部分中所做的:
Where-Object{$_ -match '(?ms)BILLING ADDRESS\s (\S. ?)[\r\n]. ?[\r\n](\S @\S )'}
這表示我們只想要與指定的 RegEx 模式匹配的電子郵件。如果您需要解釋 RegEx(正則運算式),我將讓您了解RegEx 101如何將其分解。匹配中有兩個捕獲組,這些捕獲組被填充到自動變數中,以便將結果傳遞給回圈$Matches的每次迭代。ForEach-Object作業方式是它填充$Matches一個陣列,其中匹配的整個字串是第一項,然后每個捕獲組是陣列中的一個附加項。在我們的例子中,你給定的例子是:
$Matches[0]
BILLING ADDRESS
Joe Some Blow
123 Nowhere
Someplace, TX 75075
joeblow@nowhere.org
$Matches[1]
Joe Some Blow
$Matches[2]
joeblow@nowhere.org
然后我只是遍歷結果以利用$Matches結果,并為每個結果構建一個物件。
ForEach-Object{
[pscustomobject]@{
FirstName=$Matches[1].split(' ')[0];
LastName=$Matches[1].Split(' ')[-1];
Email=$Matches[2]
}
}
我使用第一個捕獲組 (Joe Some Blow),將其拆分為空格.split(' '),并使用拆分的第一個結果作為名字,最后一個結果作為姓氏。我為電子郵件地址獲取第二個捕獲組。然后它只是}關閉外ForEach-Object回圈的最后一個(我的評論中缺少)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478639.html
