powershell - 如何动态地将项目添加到数组中并计算它们的出现次数?
问题描述
我收到了大量关于这件事的自动警报(每天 500-600 个),我正在尝试编写一个 powershell 脚本来为我分析它们。
它现在能做的是
在我的前景中解析一个子文件夹
使用正则表达式,自动抓取电子邮件警报中的特定变量
每个循环都将每个匹配项转储到 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 个我不知道的变量,每周都有数百个用户来来去去。这是动态添加然后计数,尽管“可能重复”回答了我的一半问题。
解决方案
您的脚本有一些小问题。该$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
推荐阅读
- swift - Firestore 响应“在范围内找不到‘卡片’”
- r - 未找到 Eval 对象“MEDV”中的线性回归错误
- sequence - 为什么在实践中不使用斐波那契数列的封闭形式?
- java - 从两个视图中获取相同的对象
- python - Python OpenCV 错误:(-215:断言失败)_step >= minstep in function 'cv::Mat::Mat'
- arrays - 最简单的准系统循环将整数添加到循环中使用 .space 制作的数组中,然后检索它们并按 MIPS 组装的顺序打印它们
- python - shutil 说子文件夹正在使用中,因此无法移动它并且程序崩溃但一切都已成功移动
- github - 通过 RESTful SDK 解决项目卡中的 GitHub 问题
- python - Python web scraper 不适用于深度嵌套的标签
- javascript - 发送消息,包括按钮