Назад | Перейти на главную страницу

Как я могу переместить элементы Exchange в PST с помощью PowerShell?

У нас есть почтовый ящик, который получает электронные письма о статусе, которые нам необходимо сохранить навсегда, и они содержат потенциально большие вложения. Мне нужно иметь возможность регулярно (ежедневно или еженедельно) перемещать эти сообщения в PST, поэтому хочу автоматизировать это.

На данный момент я использую MailboxExportRequest чтобы поместить их в PST:

New-MailboxExportRequest -ContentFilter {(Received -ge '01/01/2013') -and (Received -lt '01/02/2013')} -Mailbox "MonitorMailbox" -FilePath "\\Server\backup\EmailLog\MonitorMailbox 2013-01.pst"

И я следую за этим SearchMailbox -DeleteContent:

Get-Mailbox -Identity "MonitorMailbox" | Search-Mailbox -SearchQuery "Received:01/01/2013..01/02/2013" -DeleteContent

Проблема в том, что мне приходится вручную обновлять параметры даты каждый раз в четырех местах, и меня беспокоит, что это не очень транзакционный (если это вообще имеет смысл в данном контексте).

Я пытаюсь создать небольшой скрипт PS для перебора дат по месяцам и создания набора команд для просмотра и экспорта этой информации, но мне было интересно, есть ли более простой способ «перейти на PST», или мне нужно попробуйте построить приведенные выше утверждения динамически.


Вот более полный сценарий, который у меня есть, который должен экспортировать все элементы за 10 дней, предшествующих началу этого месяца (для ускорения тестирования):

$mailbox = "Cylindric"
$endDate = Get-Date -Day 1 "00:00:00"
$startDate = $endDate.AddDays(-10)

$month = "{0:D2}" -f [int]$startDate.Month
$year = "{0:D4}" -f [int]$startDate.Year


Write-Host -NoNewline "Exporting items between $startDate and $endDate..."
New-MailboxExportRequest -Name "EmailLog$year$month" -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -Mailbox $mailbox -FilePath "\\ReadyNAS\backup\Mailboxes\EmailLog\EmailLog${year}-${month}.pst"
Write-Host "Done."


Write-Host -NoNewline "Waiting for export to complete..."
While(!(Get-MailboxExportRequest -Mailbox $mailbox -Name "EmailLog$year$month" -Status Completed))
{
    #Sleep for a  few minutes
    Write-Host -NoNewline "."
    Start-Sleep -s 60
}
Write-Host "Done."


Write-Host -NoNewline "Removing Export Request..."
Get-MailboxExportRequest -Mailbox $mailbox -Status Completed -Name "EmailLog$year$month" | Remove-MailboxExportRequest
Write-Host "Done."

И вывод:

Exporting items between 05/22/2013 00:00:00 and 06/01/2013 00:00:00...
Name            Mailbox       Status
----            -------       ------
EmailLog201305  Cylindric     Queued
Done.
Waiting for export to complete..........Done.

Похоже, что это намного больше, чем эти 10 дней. Кажется, что PST содержит ВСЕ электронные письма!

Использовать Get-Date командлет!

Приведенный ниже фрагмент проверит, какой сейчас месяц, вычтет 1 и экспортирует все сообщения в ваш файл .pst.

$endDate = Get-Date -Day 1 "00:00:00"
$startDate = $endDate.AddMonths(-1)
$month = "{0:D2}" -f [int]$startDate.Month

# Convert dates to short date strings
$endDate = $endDate.ToShortDateString()
$startDate = $startDate.ToShortDateString()

New-MailboxExportRequest -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -Mailbox "MonitorMailbox" -FilePath "\\Server\backup\EmailLog\MonitorMailbox 2013-${month}.pst"

while(!(Get-MailboxExportRequest -Mailbox "MonitorMailbox" -Status Completed))
{
    #Sleep for a  few minutes
    Start-Sleep -s 300
}
Get-MailboxExportRequest -Mailbox "MonitorMailbox" -Status Completed | Remove-MailboxExportRequest

Get-Mailbox -Identity "MonitorMailbox" | Search-Mailbox -SearchQuery "Received:'${startDate}'..'${endDate}'" -DeleteContent

Просто запускайте это один раз в месяц, чтобы архивировать электронные письма за последние месяцы.

Если вы хотите поместить это в запланированную задачу, это должно получить то, что вы ищете:

$now=get-datetime
$fromtime=$now.addHours(-$now.hour).addMinutes(-$now.minute).addSeconds(-$now.second).addDay(-2)
$totime=$now.addHours(-$now.hour).addMinutes(-$now.minute).addSeconds(-$now.second).addDay(-1)
New-MailboxExportRequest -ContentFilter {(Received -ge $fromtime) -and (Received -lt $totime)} -Mailbox "MonitorMailbox" -FilePath "\\Server\backup\EmailLog\MonitorMailbox "+$totime.year+"-"+$totime.month+"-"+$totime.day"+".pst"
$mailQuery="Received:"+fromtime.toString("d")+".."+$totime.toString("d")
Get-Mailbox -Identity "MonitorMailbox" | Search-Mailbox -SearchQuery $mailQuery -DeleteContent

Что он делает, так это использует функции обработки даты Powershell. В $fromtime и $totime переменные сначала обнуляются до полуночи, затем устанавливаются на расстояние в один день. Затем мы используем эти переменные при построении запросов, необходимых для командлетов Exchange.