Power Shell Script для экспорта почтового ящика

853
Paramjot Singh

У меня есть скрипт, который работает, и он запрограммирован на создание резервной копии для каждого почтового ящика в течение месяца и сохранение его на локальном общем диске. Когда я запускаю скрипт, он экспортирует всю базу данных вместо указанного диапазона дат. Я не программист. Я искал в Google много, но не на 100% успешно. Я хочу следующие модификации

  1. Я хочу, чтобы этот скрипт экспортировал почтовый ящик только из определенной базы данных, а не из всех баз данных. Я пытался "-Database Databasename" в сценарии, но он выдает ошибку.

  2. Скрипт должен экспортировать все почтовые ящики из вышеупомянутой базы данных за каждый месяц. Скажем, если запустить этот скрипт 9 декабря 2015 года, он должен экспортироваться с 9 ноября по 9 декабря 2015 года. Даты должны изменяться автоматически в соответствии с датой компиляции.

  3. Нижняя часть скрипта не будет запускаться там, где начинается ExportRequest.

Это сценарий

$Export = Get-Mailbox  $endDate = Get-Date "00:00:00"  $startDate = $endDate.AddDays(-30)  $month = "" -f [int]$startDate.Month  $year = "" -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." 

Пожалуйста, помогите сделать этот скрипт идеальным. Спасибо

4
Paramjot - есть ли шанс [принять ответ] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) на один из ответов ниже, когда у вас есть шанс? Pimp Juice IT 7 лет назад 0

2 ответа на вопрос

2
Pimp Juice IT

Экспорт почтовых ящиков Exchange из определенной базы данных Exchange и из определенного диапазона дат с помощью PowerShell в файлы PST с уникальными именами

  1. Я хочу, чтобы этот скрипт экспортировал почтовый ящик только из определенной базы данных, а не из всех баз данных. Я пытался "-Database Databasename" в сценарии, но он выдает ошибку.
  2. Скрипт должен экспортировать все почтовые ящики из вышеупомянутой базы данных за каждый месяц. Скажем, если запустить этот скрипт 9 декабря 2015 года, он должен экспортироваться с 9 ноября по 9 декабря 2015 года. Даты должны изменяться автоматически в соответствии с датой компиляции.
  3. Нижняя часть скрипта не будет запускаться там, где начинается 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-файлы с именем файла, являющимся псевдонимом учетной записи почтового ящика)

ПРИМЕЧАНИЕ. Вам нужно будет изменить две переменные в этом сценарии, чтобы указать, что ваша среда настроена с именем базы данных Exchange [ и UNC-путем, куда должны экспортироваться файлы PST [ ], поэтому эти две переменные необходимо изменить. После того, как они будут изменены, запустите из окна командной консоли Exchange Server PowerShell, как я и протестировал, и подтвердил, что он работает должным образом.1. $ExchangeDB = "<Exchange_DB_Name>"2. $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"

$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

enter image description here


Тестовый забег

Ниже приведено, что вы можете вставить в консоль управления Exchange PowerShell, чтобы динамически создавать сценарий временного PowerShell для Windows за один прогон (при соблюдении критериев соответствия). После запуска в командной консоли 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"} 
1
DavidPostill

After this the script gives an error

While(!(Get-MailboxExportRequest -Mailbox $Exprot -Status Completed)) 

It looks like you have a spelling mistake.

Replace $Exprot with $Export:

While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed)) 
По крайней мере, я мог бы исправить ** очевидную ** ошибку. Я действительно не очень хорошо знаю PS. Поэтому я не могу исправить твои другие ошибки. DavidPostill 8 лет назад 0

Похожие вопросы