メールボックスをエクスポートするPower Shellスクリプト

メールボックスをエクスポートするPower Shellスクリプト

スクリプトは動作しており、各メールボックスのバックアップを 1 か月分取得し、ローカル共有ドライブに保存するようにプログラムされています。スクリプトを実行すると、指定した日付範囲ではなく、データベース全体がエクスポートされます。私はプログラマーではありません。Google でたくさん検索しましたが、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 DB および特定の日付範囲から Exchange メールボックスを一意の名前を持つ PST ファイルにエクスポートする

  1. このスクリプトでは、すべてのデータベースではなく、特定のデータベースからのみメールボックスをエクスポートするようにします。スクリプトで「-Database Databasename」を試しましたが、エラーが発生します。
  2. スクリプトは、上記のデータベースから各月のメールボックスをすべてエクスポートする必要があります。たとえば、このスクリプトを 2015 年 12 月 9 日に実行すると、2015 年 11 月 9 日から 12 月 9 日までがエクスポートされます。日付はコンパイル日に応じて自動的に変更される必要があります。
  3. ExportRequest が開始されるスクリプトの下部は実行されません。

質問1について。コマンドを入力してGet-Mailbox -Database $ExchangeDB、それをロジックの残りの部分にパイプするだけのようです。ここで変数を設定し$ExchangeDB、それを Exchange DB 名に設定します。何らかの理由で、このコマンドを変数として設定してからパイプする必要があります。そうしないと、同時パイプライン処理などに問題が生じます。

質問2について。何らかの理由で、データ変数は日付文字列を含むパラメータとうまく連携しないようです-ContentFilterが、日付から日数を引いた値を変数に入れて、それをコマンドの一部として連結し、実行時にそのコマンドを使用すると連携します。

質問3について。David がすでにこの質問に答えているようですが、問題が発生している部分は単にタイプミスの問題かもしれません。それ以外の場合は、-Mailbox $Exportコマンド内の部分は必要ないと思うので、ループ内でこの構文を使用してどのような結果が得られるか自由にテストしてください。

Get-MailboxExportRequest -resultsize "unlimited" -Status Completed | Remove-MailboxExportRequest -confirm:$false

スクリプトの注意点

  • $FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")その日付から現在の日付までのデータを取得するため、現在の日付から減算する日数を設定した日付変数が 1 つあります。
  • コマンドGet-Mailbox -Database $ExchangeDBを変数として設定し、その変数を [dynamic command]$DynCMD変数の他の部分にパイプする必要があります。そうしないと、同時パイプライン処理に問題が発生します。
  • パラメータを とともに使用するのではなく、 BOTHReceived -geとを使用します。これにより、両方向の電子メール項目の受信日と送信日以降の両方が取得されます。Sent -ge-or-and-ContentFilter
  • これは私にとっては大変な作業になったので、最終的には、すべての適用可能な変数などが設定された PowerShell スクリプトを動的に構築し、その後そのスクリプトを実行するようにしました。スクリプトは%temp%Windows OS 環境変数の場所に配置され、実行前に存在する場合は削除されてから構築されます。

問題メモ

(はうまくいくと思っていましたInvoke-Commandが、時間が足りなかったので、すべての適用可能な変数を基準に従って設定したPowerShellスクリプトにパイプして、後で実行する方が簡単でタイムリーでした。 は、Invoke-Command他の変数に連結された変数やビルドされた動的コマンドに問題があるため、これは簡単で、期待どおりに動作して問題を解決することが確認されました。ただし、#3については、まだ100%確信が持てないので、Davidが示唆したようにタイプミスであると仮定します。質問3について。私が提供した構文は解決されます。


POWERSHELL サンプル スクリプト (パイプライン ループ)

(特定の Exchange DB からすべての Exchange メールボックスを、メールボックス アカウントのエイリアス名をファイル名とする PST ファイルにファイル共有にエクスポートします)

注記:このスクリプト内の2つの変数を変更して、環境が設定されている内容を示す必要があります。1. Exchange DB名[$ExchangeDB = "<Exchange_DB_Name>"そして2. PST ファイルをエクスポートする UNC パス[ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"] そのため、これら 2 つの変数を変更する必要があります。これらを変更したら、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コンソールの画面印刷

ここに画像の説明を入力してください


テスト走行

以下は、実行ごとに Windows 一時 PowerShell スクリプトを動的に構築するために Exchange PowerShell 管理コンソールに貼り付けることができるものです (完了条件を満たす場合)。これが Exchange PowerShell 管理シェルで実行されたら (PS ではなく Exchange Server で)、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"}

答え2

この後、スクリプトはエラーを出します

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

スペルミスがあるようです。

$Exprotと置換する$Export

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

関連情報