【问题标题】:How to get number of emails sent daily via Exchange Server 2013如何获取每天通过 Exchange Server 2013 发送的电子邮件数量
【发布时间】:2017-10-07 15:19:41
【问题描述】:

我正在编写一个 powershell 脚本,用于查询我们的 Exchange 服务器在几天的列表中每天数量的 SENT 电子邮件。

我想将结果输出到 excel 文件中,以便进行更多分析(数据透视表等)。

我遇到的问题是我好几天都在硬编码,但希望它能够灵活地运行几个月。

$StartTime = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-7),
$EndTime = (Get-Date -Hour 23 -Minute 59 -Second 59).AddDays(-1),

ForEach ($Email in $FilterArr) {
    $MTL = Get-MessageTrackingLog -Start $StartTime -End $EndTime -EventId SEND -ResultSize Unlimited -Sender $Email.Email

    [Int]$Day0Mail = ($MTL | Where-Object {($_.Timestamp -gt $ArrayStartDates[0]) -And ($_.Timestamp -lt (Get-Date $ArrayStartDates[0] -Hour 23 -Minute 59 -Second 59))}).Count
    [Int]$Day1Mail = ($MTL | Where-Object {($_.Timestamp -gt $ArrayStartDates[1]) -And ($_.Timestamp -lt (Get-Date $ArrayStartDates[1] -Hour 23 -Minute 59 -Second 59))}).Count
    ...

    $MailObj = New-Object -TypeName psobject -Property ([Ordered]@{
                Name = $Email.Name
                Email = $Email.Email
                [String]$ArrayStartDates[0].ToShortDateString() = $Day0Mail
                [String]$ArrayStartDates[1].ToShortDateString() = $Day1Mail
                ....

    $ReportArr += $MailObj
}

$ReportArr | Export-Csv -NoTypeInformation -Path $ReportPath -Force

【问题讨论】:

  • ...问题是什么?
  • 说硬编码几天的位,我想将 StartTime 设置为 -180 天,并将其设置为“Just Work” TM
  • 尝试将-7 更改为-180..?
  • 然后我要写 180 行 [Int]$Day0Mail =, [Int]$Day1Mail =, [Int]$Day2Mail =, [Int]$Day3Mail = ???然后如何将这些数字放入 $MailObj 并连接以通过 Excel/CSV 轻松输出。
  • 啊哈!现在您的要求变得更加清晰!正如当前答案所暗示的那样:您需要一个循环。

标签: powershell exchange-server exchange-server-2013


【解决方案1】:

您有几个选择。你可以在这些周围放置一个Param() 块:

Param(
    $StartTime = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-7),
    $EndTime = (Get-Date -Hour 23 -Minute 59 -Second 59).AddDays(-1)
)

这将保留您的默认值,但如果您想覆盖它们,您可以像这样运行您的脚本:

.\YourScript.ps1 -StartTime 01/02/2017 -EndTime (get-date)

或者,如果您只是想灵活调整之前收集数据的天数,请在现有代码上方添加一个类似这样的 Param 块:

Param($Days = 7)

然后将这一行改成如下:

$StartTime = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-$Days)

再一次,像这样运行脚本:

.\YourScript.ps1 -Days 180

或者,如果您不想使用参数执行此操作,您可以使用$Days 解决方案,但改用Read-Host

$Days = Read-Host "How many days history do you want?"
$StartTime = (Get-Date -Hour 00 -Minute 00 -Second 00).AddDays(-$Days)

根据 cmets,要处理代码的其他重复部分,请确保您有一个 $Days 参数,然后您可以像这样添加一个内部 ForEach 循环:

$MailObj = New-Object -TypeName psobject -Property ([Ordered]@{
            Name = $Email.Name
            Email = $Email.Email
        })

0..$Days | ForEach-Object {
    $DayMail = 0
    $Day = $_
    [int]$DayMail = ($MTL | Where-Object {($_.Timestamp -gt $ArrayStartDates[$Day]) -And ($_.Timestamp -lt (Get-Date $ArrayStartDates[$Day] -Hour 23 -Minute 59 -Second 59))}).Count
    $MailObj | Add-Member -MemberType NoteProperty -Name ($ArrayStartDates[$Day].ToShortDateString()) -Value $DayMail
}

【讨论】:

  • 对不起,马克,但重点是自动化 [Int]$Day0Mail、[Int]$Day1Mail、[Int]$Day2Mail、[Int]$Day3Mail 等
  • 好的,只需要一个简单的循环,我会修改答案。
  • 添加了一个潜在的解决方案,但未经测试。试试看,我需要模拟一个 POC 来测试它。
  • 您的代码没有显示$ArrayStartDates 的填充方式,但我做了一个假设。还值得注意的是,可能有比这更优雅的解决方案,但我正在您现有脚本的约束范围内工作,以(希望)使其更易于理解。
  • 怕它只输出1天
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2017-12-18
  • 2013-06-05
  • 1970-01-01
  • 2016-12-28
  • 2019-06-05
相关资源
最近更新 更多