首页 > 解决方案 > 如何动态地将项目添加到数组中并计算它们的出现次数?

问题描述

我收到了大量关于这件事的自动警报(每天 500-600 个),我正在尝试编写一个 powershell 脚本来为我分析它们。

它现在能做的是

  1. 在我的前景中解析一个子文件夹

  2. 使用正则表达式,自动抓取电子邮件警报中的特定变量

  3. 每个循环都将每个匹配项转储到 csv 的新行中

我正在尝试计算每个用户的出现次数。因此,如果出现“jdoe”,它会将其添加到数组中。如果“Jdoe”在 2000 封左右的电子邮件中再出现 4 次,那么最后它会说类似

Jdoe 5

Jbond 2

客人 100

我在想可能是一个二维数组?但我无法绕过它。

我是一个非常薄弱的​​编码员,我必须在下面发表评论,这样我才能更好地了解每件作品在做什么

Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
$namespace = $Outlook.GetNameSpace("MAPI")
$DebugPreference = 'Continue'

#------------
# Selects my Inbox, and then selects sub-folder under inbox. For my outlook, I have a subfolder called
# "Account Locked Alerts" that I have an outlook rule put all of the account locked out alerts in
#------------
$inbox = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox)    
$subfolder = $inbox.Folders('Account Locked Alerts')

#------------
#I'm using RegEx here because selecting the values is super dooper easy. Also, there's technically two "account name" value in these emails
# and I'm interested in the second.
#------------
$RE = [RegEx]'(?sm)Account Name\s*:\s*(?<AccName>.*?)$.*Account Name\s*:\s*(?<Acc2Name>.*?)$.*'

$users = @()


#------------
# For every email in my sub folder...
# (p.s., to check every email in "inbox", just replace $subfolder with $inbox)
#------------
$Data = ForEach ($item in $subfolder.items){

    #------------
    # Check to see if there's a match, and if there is....
    #------------
    if ($item.body -match $RE){
        #------------
        # Add to array and write it to csv
        #------------
        Write-Host "ding " $Matches.Acc2Name
        $users += $Matches.Acc2name
            [PSCustomObject]@{
                AccName = $Matches.Acc2Name
            }
    }

}


$Data 
$Data | Export-CSv '.\data.csv' -NoTypeInformation

编辑:这个问题已被标记为另一个问题。我不这么认为,因为链接的可能副本已经知道预期的变量,并且只是计算它们。我有 9000 个我不知道的变量,每周都有数百个用户来来去去。这是动态添加然后计数,尽管“可能重复”回答了我的一半问题。

标签: powershelloutlook

解决方案


您的脚本有一些小问题。该$users变量不是必需的,您可以使用它group-by来获得您想要的结果。

遵循稍微修改的脚本可能就足够了。

#------------
#I'm using RegEx here because selecting the values is super dooper easy. Also, there's technically two "account name" value in these emails
# and I'm interested in the second.
#------------
$RE = [RegEx]'(?sm)Account Name\s*:\s*(?<AccName>.*?)$.*Account Name\s*:\s*(?<Acc2Name>.*?)$.*'


#------------
# For every email in my sub folder...
# (p.s., to check every email in "inbox", just replace $subfolder with $inbox)
#------------
$Data = ForEach ($item in $subfolder.items){

    #------------
    # Check to see if there's a match, and if there is....
    #------------
    if ($item.body -match $RE){
        #------------
        # Add to array and write it to csv
        #------------
        Write-Verbose "ding " $Matches.Acc2Name
        [PSCustomObject]@{
                Acc2Name = $Matches.Acc2Name
        }
    }

}

$Data | Group-Object -Property Acc2Name -NoElement
$Data | Export-CSv '.\data.csv' -NoTypeInformation

推荐阅读