![Скрипт Power Shell для экспорта почтового ящика](https://rvso.com/image/1476384/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82%20Power%20Shell%20%D0%B4%D0%BB%D1%8F%20%D1%8D%D0%BA%D1%81%D0%BF%D0%BE%D1%80%D1%82%D0%B0%20%D0%BF%D0%BE%D1%87%D1%82%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE%20%D1%8F%D1%89%D0%B8%D0%BA%D0%B0.png)
У меня есть скрипт, он работает и запрограммирован на создание резервной копии для каждого почтового ящика в течение месяца и сохранение ее на локальном общем диске. Когда я запускаю скрипт, он экспортирует всю базу данных вместо указанного диапазона дат. Я не программист. Я много искал в 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."
Пожалуйста, помогите сделать этот скрипт идеальным. Спасибо
решение1
Экспорт почтовых ящиков Exchange из определенной базы данных Exchange и из определенного диапазона дат с помощью PowerShell в файлы PST с уникальными именами
- Я хочу, чтобы этот скрипт экспортировал почтовый ящик только из определенной базы данных, а не из всех баз данных. Я попробовал "-Database Databasename" в скрипте, но он выдает ошибку.
- Скрипт должен экспортировать все почтовые ящики из вышеупомянутой базы данных для каждого месяца. Скажем, если запустить этот скрипт 9 декабря 2015 года, он должен экспортировать с 9 ноября по 9 декабря 2015 года. Даты должны автоматически измениться в соответствии с датой компиляции.
- Нижняя часть скрипта не будет запущена там, где начинается ExportRequest.
Для вопроса №1.Похоже, вам просто нужно вставить команды Get-Mailbox -Database $ExchangeDB
, а затем передать их по конвейеру остальной части логики и т. д. Это будет то, где вы устанавливаете переменную $ExchangeDB
и устанавливаете ее на имя вашей базы данных Exchange. По какой-то причине вам приходится устанавливать эту команду как переменную, а затем передавать ее по конвейеру, или есть какая-то проблема с параллельным конвейером и т. д.
Для вопроса №2.Похоже, что переменная data -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
иначе возникнет проблема с параллельной конвейеризацией. - Используйте BOTH
Received -ge
иSent -ge
with-or
вместо-and
параметра with-ContentFilter
— это гарантирует, что вы получите и то, и другое с даты получения и отправки для элементов электронной почты в обоих направлениях. - Это превратилось в сложную задачу для меня, поэтому я просто сделал так, чтобы он динамически создавал скрипт PowerShell со всеми применимыми переменными и т. д., а затем выполнял этот скрипт. Скрипт помещается в
%temp%
местоположение переменных среды ОС Windows, и если он существует до запуска, он удаляет его, а затем создает его.
Примечание к выпуску
(Я думал, что это Invoke-Command
сработает, но у меня не хватило времени, поэтому мне было проще и гораздо более своевременно передать все в скрипт PowerShell со всеми применимыми переменными, установленными в соответствии с критериями, и просто выполнить его после этого. У есть Invoke-Command
проблемы с переменными, объединенными с другими переменными, и построенными динамическими командами, поэтому это было просто и, как было подтверждено, работает так, как и ожидалось, для решения ваших проблем, за исключением пункта 3, в котором я все еще не уверен на 100%, поэтому предположим, что это опечатка, как предположил Дэвид, если толькоДля вопроса №3.(Предоставленный мной синтаксис разрешает.)
ПРИМЕР СКРИПТА POWERSHELL (КОНВЕЙЕРНЫЙ ЦИКЛ)
(Экспорт всех почтовых ящиков Exchange из определенной базы данных Exchange в общую папку в виде файлов PST, при этом имя файла будет псевдонимом учетной записи почтового ящика)
ПРИМЕЧАНИЕ:Вам нужно будет изменить две переменные в этом скрипте, чтобы они указывали на то, как настроена ваша среда.1.
Имя базы данных Exchange[ $ExchangeDB = "<Exchange_DB_Name>"
и2.
UNC-путь, куда будут экспортированы PST-файлы[ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"
] поэтому эти две переменные нужно изменить. После того, как они будут изменены, запустите из окна командной консоли PowerShell Exchange Server, как я это и протестировал, и подтвердил, что все работает так, как и ожидалось.
$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 (ЦИКЛ FOREACH)
$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"
Консоль управления Exchange Print и PowerShell
Тестовый забег
Ниже приведено то, что вы можете вставить в консоль управления Exchange PowerShell для динамического построения временного скрипта PowerShell Windows при каждом запуске (при выполнении критериев соответствия). После того, как это будет выполнено в оболочке управления Exchange PowerShell на сервере Exchange, но не в PS, перейдите в Start
--> Run
--> и введите %Temp%
и нажмите Enter.
Оттуда посмотрите, PS1
создан ли файл с именем TempMBExport.ps1
и откройте его с помощью Notepad и посмотрите на логику. Посмотрите, что произойдет, если вы скопируете то, что находится в этом скрипте, в консоль управления 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, как я сказал выше, и открываю его с помощью блокнота, чтобы просто посмотреть логику, он строит его в этом формате с этим sytax, так что, возможно, попробуйте запустить это в вашей Exchange PS Management Shell и посмотрите, какие результаты вы получите. Если это работает таким образом, то проблема как-то связана с выполнением скрипта, но вы не получаете никаких ошибок, но, возможно, это также прольет свет на тему.
$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"}
решение2
После этого скрипт выдает ошибку
While(!(Get-MailboxExportRequest -Mailbox $Exprot -Status Completed))
Похоже, у вас орфографическая ошибка.
Заменить :$Exprot
$Export
While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed))