Power Shell Script per esportare la cassetta postale


3

Ho uno script che funziona ed è programmato per prendere il backup per ogni casella di posta per un mese e archiviarlo nell'unità condivisa locale. Quando eseguo lo script, esporta l'intero database invece dell'intervallo di date specificato. Non sono un programmatore. Ho cercato un lotto di Google ma non ho avuto successo al 100%. Voglio le seguenti modifiche

  1. Voglio che lo script esporti la cassetta postale solo da un database specifico e non da tutti i database. Ho provato "-Database Databasename" nello script ma mi dà l'errore.

  2. Lo script dovrebbe esportare tutte le cassette postali dal database sopra menzionato per ogni mese. Di 'Se esegui questo script il 9 dicembre 2015, dovrebbe esportare dal 9 novembre al 9 dicembre 2015. Le date devono essere cambiate automaticamente in base alla data di compilazione.

  3. La parte inferiore dello script non verrà eseguita dove inizia ExportRequest.

Questo è lo script

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

Dopo che questo script dà errore. Ma le cassette postali vengono esportate per intero

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

Aiutate a rendere perfetto questo script. Grazie


Paramjot - Qualche possibilità di accettare una risposta su una delle risposte seguenti quando ne hai la possibilità?
Pimp Juice IT

Risposte:


2

Esporta le cassette postali di Exchange da un determinato database di Exchange e da un particolare intervallo di date con PowerShell in file PST con nomi univoci

  1. Voglio che lo script esporti la cassetta postale solo da un database specifico e non da tutti i database. Ho provato "-Database Databasename" nello script ma mi dà l'errore.
  2. Lo script dovrebbe esportare tutte le cassette postali dal database sopra menzionato per ogni mese. Di 'Se esegui questo script il 9 dicembre 2015, dovrebbe esportare dal 9 novembre al 9 dicembre 2015. Le date devono essere cambiate automaticamente in base alla data di compilazione.
  3. La parte inferiore dello script non verrà eseguita dove inizia ExportRequest.

Per la domanda n. 1. Sembra che tu debba solo inserire iGet-Mailbox -Database $ExchangeDBcomandi e poi reindirizzarlo al resto della logica, ecc. Qui sarebbe dove impostare una variabile$ExchangeDBe impostarla sul nome del database Exchange. Per qualche motivo devi impostare questo comando come variabile e quindi reindirizzarlo o c'è qualche problema con il pipelining simultaneo, ecc.

Per la domanda n. 2. Sembra che la variabile di dati non vada bene con il-ContentFilterparametro con la stringa di data per qualche motivo, ma lo fa se metti la data meno i giorni in una variabile e la concateni come parte di un comando e poi usi quel comando quando viene eseguito.

Per la domanda n. 3. Sembra che David abbia risposto a questa domanda e potrebbe trattarsi solo di un errore di battitura per questa parte in cui si verificano problemi. Altrimenti, sentiti libero di testare con questa sintassi nel tuo ciclo per vedere quali risultati ottieni poiché non penso che tu abbia bisogno delle-Mailbox $Exportparti nel comando:

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

PUNTI DI NOTA SCRITTA

  • Una variabile di data impostata con il numero di giorni da sottrarre dalla data corrente $FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")poiché otterrai i dati da quella data alla data corrente.
  • Il Get-Mailbox -Database $ExchangeDBcomando deve essere impostato come variabile e quindi quella variabile reindirizzata alle altre parti della $DynCMDvariabile [comando dinamico] o c'è un problema con il pipelining simultaneo.
  • Usa ENTRAMBE Received -gee Sent -gecon -orinvece che -andcon il -ContentFilterparametro: questo ti assicura di ottenere sia dalla data di ricezione che da quella inviata per gli articoli di posta elettronica in entrambe le direzioni.
  • Questo si è trasformato in un bel compito per me, quindi ho finito per farlo in modo da creare dinamicamente uno script PowerShell con tutte le variabili applicabili, ecc. Impostato e quindi eseguire quello script in seguito. Lo script viene inserito nella %temp%posizione della variabile ambientale del sistema operativo Windows e, se esiste prima dell'esecuzione, lo elimina e quindi lo crea.

Nota sul problema

(Ho pensato che Invoke-Commandavrebbe funzionato, ma ho esaurito il tempo, quindi è stato più facile e molto più tempestivo per me eseguire il piping di tutto su uno script di PowerShell con tutte le variabili applicabili impostate in base ai criteri ed eseguirlo in seguito. Invoke-CommandProblemi con le variabili concatenato ad altre variabili e creato comandi dinamici, quindi questo è stato semplice e confermato per funzionare come previsto per risolvere i tuoi problemi, diverso dal n. 3, che non sono ancora sicuro al 100% del problema esattamente lì, quindi assumendo l'errore di battitura come suggerito da David a meno che la sintassi della domanda n. 3. fornita non sia risolta.)


POWERSHELL EXAMPLE SCRIPT (PIPELINE LOOP)

(Esportare tutte le cassette postali di Exchange da un determinato DB di Exchange in una condivisione file in file PST con il nome file che è il nome di collegamento dell'account della cassetta postale)

NOTA: sarà necessario modificare due variabili in questo script per indicare a quale ambiente è configurato il nome del database Exchange [ e il percorso UNC in cui devono essere esportati i file PST [ ], quindi è necessario modificare tali due variabili. Una volta modificati, esegui dalla finestra della console di comando di PowerShell di Exchange Server, che è il modo in cui l'ho testato e confermato che ha funzionato come previsto.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"

SCRIPT DI ESEMPI DI POWERSHELL (FOROACH LOOP)

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

Serigrafia Exchange Management Console e PowerShell Console

inserisci qui la descrizione dell'immagine


Prova

Di seguito è riportato ciò che è possibile incollare nella console di gestione di PowerShell di Exchange per creare dinamicamente lo script PowerShell temporaneo di Windows per esecuzione (secondo i criteri di conformità della conformità). Una volta eseguito in Exchange PowerShell Management Shell, su Exchange Server ma non su PS, vai su Start-> Run-> e digita %Temp%e premi Enter.

Da lì vedi se il PS1file viene creato con nome TempMBExport.ps1e aprilo con Blocco note e osserva la logica. Guarda cosa succede se copi ciò che è nello script nella console di gestione di PowerShell di Exchange e premi Enter.

Non sono sicuro se c'è un problema con questo non andare nella cartella della variabile ambientale Temp di Windows se il file non esiste o la console PS non ha accesso per eseguirlo da lì o se la tua versione di Exchange non piace una di questi comandi, quindi inizia con questo e vediamo cosa succede per risolvere i problemi.

Questo script di seguito esclude la & "$TempPSScript"parte in modo che NON esegua lo %temp%\TempMBExport.ps1script creato in modo dinamico e complimentato , confermando così che si trova nella posizione e se questa logica verrà eseguita nella console di gestione di Exchange PS è un buon passo successivo per capire il problema.

È difficile risolvere i problemi per iscritto senza accesso o supporto remoto, quindi sono un po 'limitato qui e devo purtroppo specularne alcuni. Non sono sicuro di quali ulteriori opzioni avresti, ma quelle sono alcune considerazioni rapide.

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

INFINE

Quando eseguo il PS come ho detto sopra e lo apro con il blocco note solo per vedere la logica, lo costruisce in questo formato con questo sintassi, quindi forse prova a eseguirlo in Exchange PS Management Shell e vedi quali risultati ottieni. Se funziona in questo modo, il problema ha a che fare con l'esecuzione dello script ma non si ottengono errori, ma forse questo farà luce anche sull'argomento.

$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

Dopo questo lo script dà un errore

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

Sembra che tu abbia un errore di ortografia.

Sostituisci $Exprotcon $Export:

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

<shrug> Almeno potrei correggere l' ovvio errore. Non conosco molto bene PS. Quindi non posso correggere i tuoi altri errori.
DavidPillill
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.