用於匯出郵件信箱的 Power Shell 腳本

用於匯出郵件信箱的 Power Shell 腳本

我有一個正在運行的腳本,它被編程為每個郵箱備份一個月並將其儲存到本地共用磁碟機。當我運行腳本時,它會導出整個資料庫而不是指定的日期範圍。我不是程式設計師。我在谷歌上搜尋了很多,但不是 100% 成功。我想要以下修改

  1. 我希望該腳本僅從特定資料庫匯出郵箱,而不是從所有資料庫匯出郵箱。我在腳本中嘗試了“-Database Databasename”,但它給出了錯誤。

  2. 腳本應每月從上述資料庫中匯出所有郵箱。假設如果在 2015 年 12 月 9 日執行此腳本,它應該從 2015 年 11 月 9 日到 12 月 9 日匯出。

  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."

請幫忙完善這個腳本。謝謝

答案1

使用 PowerShell 將 Exchange 信箱從特定 Exchange 資料庫和特定日期範圍匯出到具有唯一名稱的 PST 文件

  1. 我希望該腳本僅從特定資料庫匯出郵箱,而不是從所有資料庫匯出郵箱。我在腳本中嘗試了“-Database Databasename”,但它給出了錯誤。
  2. 腳本應每月從上述資料庫中匯出所有郵箱。假設如果在 2015 年 12 月 9 日執行此腳本,它應該從 2015 年 11 月 9 日到 12 月 9 日匯出。
  3. 腳本的底部不會在 ExportRequest 開始的地方運作。

對於問題#1。看起來您只需要輸入命令,然後透過管道將其Get-Mailbox -Database $ExchangeDB傳遞給其餘的邏輯等。$ExchangeDB由於某種原因,您必須將此命令設為變量,然後對其進行管道傳輸,否則並發管道傳輸會出現一些問題等。

對於問題#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變數的其他部分,否則並發管道傳輸會出現問題。
  • 使用 BOTHReceived -geSent -gewith-or而不是-andwith-ContentFilter參數 — 這可確保您從兩個方向的電子郵件項目的接收和發送日期起獲得兩者。
  • 這對我來說是一項艱鉅的任務,所以我最終完成了它,以便它動態建立一個包含所有適用變數等的 PowerShell 腳本,然後設置,然後執行該腳本。該腳本被放入%temp%Windows 作業系統環境變數位置,如果它在運行之前存在,則會將其刪除,然後建置它。

發行說明

(我認為這Invoke-Command會起作用,但我沒時間了,所以對我來說,將所有內容通過管道傳輸到 PowerShell 腳本並根據條件設置所有適用的變量,然後執行它會更容易、更及時。Invoke-Command變量存在問題連接到其他變數並建立動態命令,所以這很簡單,並且確認可以按預期工作來解決您的問題,除了 #3,我仍然不能 100% 確定問題所在,所以假設有大衛建議的拼寫錯誤除非對於問題#3。我提供的語法可以解析。


POWERSHELL 範例腳本(管道循環)

(將所有 Exchange 郵箱從特定 Exchange 資料庫匯出到文件共用到 PST 文件,文件名稱是郵箱帳戶別名)

筆記:您需要更改此腳本中的兩個變數以指向您的環境配置1. Exchange 資料庫名稱[$ExchangeDB = "<Exchange_DB_Name>"2. 要匯出 PST 檔案的 UNC 路徑[ $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 範例腳本(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 管理主控台和 PowerShell 控制台

在此輸入影像描述


測試運行

以下是您可以貼上到 Exchange PowerShell 管理控制台中的內容,以在每次執行時動態建立 Windows 臨時 PowerShell 腳本(在滿足標準的情況下)。在 Exchange PowerShell 命令列管理員中執行後,在 Exchange Server 上但不在 PS 中,前往Start--> Run--> 並輸入%Temp%並按Enter

從那裡查看PS1文件是否已建立命名TempMBExport.ps1並用記事本打開它並查看邏輯。如果將該腳本中的內容複製到 Exchange PowerShell 管理主控台並按 ,看看會發生什麼Enter

我不確定如果該文件不存在或 PS 控制台無法從那裡執行它,或者如果您的 Exchange 版本不喜歡該文件,則不會進入 Windows Temp 環境變量文件夾是否存在問題這些命令的所以從這裡開始,讓我們看看會發生什麼故障排除。

下面的腳本排除了該& "$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 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))

相關內容