Power Shell Script для экспорта почтового ящика
У меня есть скрипт, который работает, и он запрограммирован на создание резервной копии для каждого почтового ящика в течение месяца и сохранение его на локальном общем диске. Когда я запускаю скрипт, он экспортирует всю базу данных вместо указанного диапазона дат. Я не программист. Я искал в Google много, но не на 100% успешно. Я хочу следующие модификации
Я хочу, чтобы этот скрипт экспортировал почтовый ящик только из определенной базы данных, а не из всех баз данных. Я пытался "-Database Databasename" в сценарии, но он выдает ошибку.
Скрипт должен экспортировать все почтовые ящики из вышеупомянутой базы данных за каждый месяц. Скажем, если запустить этот скрипт 9 декабря 2015 года, он должен экспортироваться с 9 ноября по 9 декабря 2015 года. Даты должны изменяться автоматически в соответствии с датой компиляции.
Нижняя часть скрипта не будет работать там, где начинается ExportRequest.
Это сценарий
$Export = Get-Mailbox
$endDate = Get-Date "00:00:00"
$startDate = $endDate.AddDays(-30)
$month = "{0:D2}" -f [int]$startDate.Month
$year = "{0:D4}" -f [int]$startDate.Year
Write-Host -NoNewline "Exporting items between $startDate and $endDate..."
$Export|%{$_|New-MailboxExportRequest -ContentFilter {(Received -ge $startDate) -and (Received -lt $endDate)} -FilePath "\\FileServer\EmailBackups\ExportTest\Test\$($_.alias).pst"}
Write-Host "Done."
Write-Host -NoNewline "Waiting for export to complete..."
После этого скрипт выдает ошибку. Но почтовые ящики экспортируются полностью
While(!(Get-MailboxExportRequest -Mailbox $Exprot -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 $Export -Status Completed | Remove-MailboxExportRequest
Write-Host "Done."
Пожалуйста, помогите сделать этот скрипт идеальным. Спасибо
2 ответа
Экспорт почтовых ящиков Exchange из определенной базы данных Exchange и из определенного диапазона дат с помощью PowerShell в файлы PST с уникальными именами
- Я хочу, чтобы этот скрипт экспортировал почтовый ящик только из определенной базы данных, а не из всех баз данных. Я пытался "-Database Databasename" в сценарии, но он выдает ошибку.
- Скрипт должен экспортировать все почтовые ящики из вышеупомянутой базы данных за каждый месяц. Скажем, если запустить этот скрипт 9 декабря 2015 года, он должен экспортироваться с 9 ноября по 9 декабря 2015 года. Даты должны изменяться автоматически в соответствии с датой компиляции.
- Нижняя часть скрипта не будет работать там, где начинается ExportRequest.
На вопрос № 1. Похоже, вам просто нужно положить в Get-Mailbox -Database $ExchangeDB
команды и затем передать это к остальной части логики, и т. д. Это было бы, где вы устанавливаете переменную $ExchangeDB
и установите это для вашего имени базы данных Exchange. По какой-то причине вы должны установить эту команду как переменную, а затем передать ее по конвейеру, или есть какая-то проблема с параллельной конвейерной обработкой и т. Д.
На вопрос № 2. Кажется, что переменная данных не очень хорошо с -ContentFilter
параметр со строкой даты по какой-то причине, но это происходит, если вы помещаете дату минус дни в переменную, и объединяете ее как часть команды, а затем используете эту команду при ее выполнении.
На вопрос № 3. Похоже, Дэвид, возможно, ответил на это, и это может быть просто опечатка для этой части, где у вас возникли проблемы. В противном случае, не стесняйтесь тестировать с этим синтаксисом в цикле, чтобы увидеть, какие результаты вы получите, так как я не думаю, что вам нужно -Mailbox $Export
части в команде:
Get-MailboxExportRequest -resultsize "unlimited" -Status Completed | Remove-MailboxExportRequest -confirm:$false
ТОЧКИ ЗАПИСИ
- Одна переменная даты установлена с количеством дней, которые нужно вычесть из текущей даты
$FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
так как вы получите данные с этой даты на текущую дату. -
Get-Mailbox -Database $ExchangeDB
Команда должна быть задана как переменная, а затем эта переменная передана в другие части [динамической команды].$DynCMD
переменная или есть проблема с параллельной конвейерной обработкой. - Используйте ОБА
Received -ge
а такжеSent -ge
с-or
скорее, чем-and
с-ContentFilter
параметр - это гарантирует, что вы получите как дату получения, так и дату отправки для элементов электронной почты в обоих направлениях. - Для меня это стало довольно сложной задачей, поэтому я просто сделал так, чтобы он динамически создавал сценарий PowerShell со всеми установленными переменными и т. Д., А затем выполнял этот сценарий впоследствии. Сценарий помещен в
%temp%
Расположение переменной среды ОС Windows, и если она существует до ее запуска, она удаляет ее, а затем создает ее.
Примечание к выпуску
(Я думал, что Invoke-Command
будет работать, но у меня не хватило времени, поэтому мне было проще и гораздо своевременнее собрать все данные в сценарий PowerShell со всеми применимыми переменными, установленными в соответствии с критериями, и просто выполнить его впоследствии. Invoke-Command
есть проблемы с переменными, сцепленными с другими переменными и построенными динамическими командами, так что это было просто и подтверждено, что оно работало, как и ожидалось, для решения ваших проблем, кроме #3, который я все еще не на 100% уверен в проблеме, точно так, предполагая опечатка, как предложил Дэвид, если только вопрос № 3. синтаксис, который я предоставил, разрешает.)
ПРИМЕР ОБОЛОЧКИ СЦЕНАРИЙ (ТРУБОПРОВОДНАЯ ПЕТЛЯ)
(Экспортируйте все почтовые ящики Exchange из определенной базы данных Exchange в общий файловый ресурс в файлы PST с именем файла, являющимся псевдонимом учетной записи почтового ящика)
ПРИМЕЧАНИЕ. Вам потребуется изменить две переменные в этом скрипте, чтобы указать, с какой конфигурацией среды вы настроены 1.
имя БД Exchange [ $ExchangeDB = "<Exchange_DB_Name>"
а также 2.
UNC-путь, куда экспортируются PST-файлы [ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"
] поэтому эти две переменные должны быть изменены. После того, как они будут изменены, запустите из командной консоли Exchange Server PowerShell, как я и протестировал, и подтвердил, что он работает должным образом.
$TempDir = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB = "Mail04-Original"
$ExportDir = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD = '$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -FilePath "' + $ExportDir + '\$($_.alias).pst"}'
If (Test-Path $TempPSScript){
Remove-Item $TempPSScript
}
'$GetMBCMD = Get-Mailbox -Database ' + $ExchangeDB + '' | Out-File -Append -Force "$TempPSScript"
$DynCMD | Out-File -Append -Force "$TempPSScript"
& "$TempPSScript"
Сценарий примера POWERSHELL (ИНОСТРАННЫЙ ПЕТЛЯ)
$TempDir = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB = "Mail04-Original"
$ExportDir = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD1 = 'ForEach ($u in (Get-Mailbox -database ' + $ExchangeDB + ')) {'
$DynCMD2 = 'New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -Mailbox $u -FilePath "' + $ExportDir + '\$($u.alias).pst"}'
If (Test-Path $TempPSScript){
Remove-Item $TempPSScript
}
$DynCMD1 | Out-File -Append -Force "$TempPSScript"
$DynCMD2 | Out-File -Append -Force "$TempPSScript"
& "$TempPSScript"
Консоль управления печатью экрана и консоль PowerShell
Тестовый забег
Ниже вы можете вставить то, что вы можете вставить в консоль управления Exchange PowerShell, чтобы динамически создавать сценарий Windows PowerShell для каждого запуска (при соблюдении критериев соответствия). После запуска в командной консоли Exchange PowerShell на сервере Exchange, но не в PS перейдите к Start
-> Run
-> и введите %Temp%
и нажмите Enter.
Оттуда посмотреть, если PS1
файл создан с именем TempMBExport.ps1
и откройте его с помощью блокнота и посмотрите на логику. Посмотрите, что произойдет, если вы скопируете содержимое этого скрипта в консоль управления Exchange PowerShell и нажмете Enter.
Я не уверен, есть ли проблема с тем, что это не происходит в папку переменных среды Windows Temp, если файл не существует или консоль PS не имеет доступа для его запуска оттуда, или если ваша версия Exchange не нравится из этих команд, так что начните с этого и давайте посмотрим, что происходит с устранением неполадок.
Этот скрипт ниже исключает & "$TempPSScript"
часть, поэтому он не выполняет динамически построенный и сложный %temp%\TempMBExport.ps1
Сценарий, подтверждающий, что он находится, и будет ли эта логика работать в консоли управления Exchange PS - хороший следующий шаг для выяснения проблемы.
Трудно устранить неполадки в письменной форме без доступа или удаленной поддержки, поэтому я немного ограничен в этом вопросе и, к сожалению, вынужден спекулировать некоторыми. Не уверен, какие дополнительные варианты у вас есть, но это несколько быстрых мыслей.
$TempDir = $env:Temp
$TempPSScript = "$TempDir\TempMBExport.ps1"
$ExchangeDB = "Mail04-Original"
$ExportDir = "\\FileServer\Emailbackups\ExportTest\MonthTest2"
$FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
$DynCMD = '$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "' + $FromDate + '") -or (Sent -ge "' + $FromDate + '")} -FilePath "' + $ExportDir + '\$($_.alias).pst"}'
If (Test-Path $TempPSScript){
Remove-Item $TempPSScript
}
'$GetMBCMD = Get-Mailbox -Database ' + $ExchangeDB + '' | Out-File -Append -Force "$TempPSScript"
$DynCMD | Out-File -Append -Force "$TempPSScript"
НАКОНЕЦ
Когда я запускаю PS, как я сказал выше, и открываю его с помощью блокнота, просто чтобы увидеть логику, он строит его в этом формате с этим синтаксисом, так что, возможно, попробуйте запустить его в командной консоли Exchange PS и посмотреть, какие результаты вы получите. Если это работает таким образом, то проблема связана с выполнением скрипта, но вы не получаете никаких ошибок, но, возможно, это также поможет пролить свет на эту тему.
$GetMBCMD = Get-Mailbox -Database Mail04-Original
$GetMBCMD | % { $_ | New-MailboxExportRequest -ContentFilter {(Received -ge "11/12/2015 00:00:00") -or (Sent -ge "11/12/2015 00:00:00")} -FilePath "\\FileServer\Emailbackups\ExportTest\MonthTest2\$($_.alias).pst"}
После этого скрипт выдает ошибку
While(!(Get-MailboxExportRequest -Mailbox $Exprot -Status Completed))
Похоже, у вас есть орфографическая ошибка.
замещать $Exprot
с $Export
:
While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed))