4

У меня есть скрипт, который работает, и он запрограммирован на создание резервной копии для каждого почтового ящика в течение месяца и сохранение его на локальном общем диске. Когда я запускаю скрипт, он экспортирует всю базу данных вместо указанного диапазона дат. Я не программист. Я искал в 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 = "{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 ответа2

2

Экспорт почтовых ящиков 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 со всеми применимыми переменными и т.д., А затем выполнял этот сценарий впоследствии. Сценарий помещается в переменную окружения ОС Windows %temp% и, если она существует до его запуска, он удаляет ее, а затем создает ее.

Примечание к выпуску

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

После этого скрипт выдает ошибку

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

Похоже, у вас есть орфографическая ошибка.

Замените $Exprot на $Export:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .