如何获取每天通过 Exchange Server 2013 发送的电子邮件数量

How to get number of emails sent daily via Exchange Server 2013

我正在编写一个 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

你有几个选择。你可以在这些周围放置一个 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($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)

根据评论,要处理代码的其他重复部分,请确保您有一个 $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
}