Tengo un script que está funcionando y está programado para realizar una copia de seguridad de cada buzón durante un mes y almacenarlo en una unidad compartida local. Cuando ejecuto el script, exporta la base de datos completa en lugar del rango de fechas especificado. No soy programador. Busqué mucho en Google pero no tuve éxito al 100%. Quiero las siguientes modificaciones
Quiero que esa secuencia de comandos exporte el buzón solo desde una base de datos específica, no desde todas las bases de datos. Intenté "-Database Nombre de la base de datos" en el script pero aparece un error.
El script debe exportar todos los buzones de la base de datos mencionada anteriormente para cada mes. Digamos que si ejecuta este script el 9 de diciembre de 2015, debería exportarse del 9 de noviembre al 9 de diciembre de 2015. Las fechas deben cambiarse automáticamente según la fecha de compilación.
La parte inferior del script no se ejecutará donde comienza ExportRequest.
Este es el guión
$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..."
Después de que este script dé error. Pero los buzones se exportan completos.
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."
Por favor ayuda a que este script sea perfecto. Gracias
Respuesta1
Exporte buzones de correo de Exchange desde una base de datos de Exchange particular y desde un rango de fechas particular con PowerShell a archivos PST con nombres únicos
- Quiero que esa secuencia de comandos exporte el buzón solo desde una base de datos específica, no desde todas las bases de datos. Intenté "-Database Nombre de la base de datos" en el script pero aparece un error.
- El script debe exportar todos los buzones de la base de datos mencionada anteriormente para cada mes. Digamos que si ejecuta este script el 9 de diciembre de 2015, debería exportarse del 9 de noviembre al 9 de diciembre de 2015. Las fechas deben cambiarse automáticamente según la fecha de compilación.
- La parte inferior del script no se ejecutará donde comienza ExportRequest.
Para la pregunta n.° 1.Parece que solo necesita ingresar los Get-Mailbox -Database $ExchangeDB
comandos y luego canalizarlos al resto de la lógica, etc. Aquí sería donde configuraría una variable $ExchangeDB
y la configuraría con el nombre de su base de datos Exchange. Por alguna razón, debe configurar este comando como una variable y luego canalizarlo o habrá algún problema con la canalización simultánea, etc.
Para la pregunta n.° 2.Parece que la variable de datos no se lleva bien con el -ContentFilter
parámetro con la cadena de fecha por alguna razón, pero sí si pones la fecha menos los días en una variable, la concatenas como parte de un comando y luego usas ese comando. cuando se ejecuta.
Para la pregunta n.° 3.Parece que David pudo haber respondido esto y puede que simplemente sea un problema tipográfico en esta parte en la que tienes problemas. De lo contrario, siéntete libre de probar con esta sintaxis en tu bucle para ver qué resultados obtienes, ya que no creo que necesites las -Mailbox $Export
partes del comando:
Get-MailboxExportRequest -resultsize "unlimited" -Status Completed | Remove-MailboxExportRequest -confirm:$false
PUNTOS DE NOTA DEL GUIÓN
- Una variable de fecha configurada con la cantidad de días que se restarán de la fecha actual,
$FromDate = (Get-Date).AddDays(-30).ToString("MM/dd/yyyy")
ya que obtendrá los datos desde esa fecha hasta la fecha actual. - El
Get-Mailbox -Database $ExchangeDB
comando debe configurarse como una variable y luego esa variable debe canalizarse a las otras partes de la$DynCMD
variable [comando dinámico] o hay un problema con la canalización simultánea. - Utilice AMBOS
Received -ge
ySent -ge
con-or
en lugar de-and
con el-ContentFilter
parámetro; esto garantiza que obtendrá ambos desde la fecha de recepción y envío de los elementos de correo electrónico en ambas direcciones. - Esto se convirtió en una gran tarea para mí, así que terminé haciéndolo para que cree dinámicamente un script de PowerShell con todas las variables aplicables, etc. configuradas y luego ejecute ese script. El script se coloca en la
%temp%
ubicación de la variable ambiental del sistema operativo Windows y, si existe antes de ejecutarse, lo elimina y luego lo compila.
Nota temática
(Pensé que Invoke-Command
funcionaría, pero se me acabó el tiempo, por lo que fue más fácil y mucho más oportuno para mí canalizar todo a un script de PowerShell con todas las variables aplicables establecidas según los criterios, y simplemente ejecutarlo después. Tiene Invoke-Command
problemas con las variables concatenado a otras variables y comandos dinámicos integrados, por lo que esto fue simple y se confirmó que funciona como se esperaba para resolver sus problemas, aparte del número 3, del cual todavía no estoy 100% seguro del problema allí exactamente, por lo que suponiendo el error tipográfico como sugirió David a menos que elPara la pregunta n.° 3.la sintaxis que proporcioné resuelve.)
GUIÓN DE EJEMPLO DE POWERSHELL (BUCLE DE TUBERÍA)
(Exporte todos los buzones de Exchange desde una base de datos de Exchange particular a un recurso compartido de archivos en archivos PST con el nombre del archivo como el nombre de alias de la cuenta del buzón)
NOTA:Necesitará cambiar dos variables en este script para indicar con qué está configurado su entorno.1.
el nombre de la base de datos de Exchange[ $ExchangeDB = "<Exchange_DB_Name>"
y2.
la ruta UNC donde se exportarán los archivos PST[ $ExportDir = "\\<ServerName>\<ShareName>\<FolderPath>"
] por lo que esas dos variables deben cambiarse. Una vez que se cambien, ejecútelo desde la ventana de la consola de comandos de Exchange Server PowerShell, así es como lo probé y confirmé que funcionó como se esperaba.
$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"
GUIÓN DE EJEMPLO DE POWERSHELL (BUCLE 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"
Impresión de pantalla Consola de administración de Exchange y consola PowerShell
Prueba de funcionamiento
A continuación se muestra lo que puede pegar en la consola de administración de Exchange PowerShell para crear el script temporal de PowerShell de Windows dinámicamente por ejecución (cuando se cumplan los criterios de finalización). Una vez que esto se ejecute en el Shell de administración de Exchange PowerShell, en Exchange Server pero no en PS, vaya a Start
--> Run
-->, escriba %Temp%
y presione Enter.
Desde allí, vea si el PS1
archivo se crea con nombre TempMBExport.ps1
, ábralo con el Bloc de notas y observe la lógica. Vea lo que sucede si copia el contenido de ese script en la consola de administración de Exchange PowerShell y presiona Enter.
No estoy seguro de si hay un problema con que esto no vaya a la carpeta de variables ambientales temporales de Windows si el archivo no existe o si la consola PS no tiene acceso para ejecutarlo desde allí o si a su versión de Exchange no le gusta uno. de esos comandos, así que comience con esto y veamos qué sucede para solucionar el problema.
El siguiente script excluye la & "$TempPSScript"
parte, por lo que NO ejecuta el %temp%\TempMBExport.ps1
script compilado y creado dinámicamente, por lo que confirmar que está en la ubicación y si esta lógica se ejecutará o no en la consola de administración de Exchange PS es un buen siguiente paso para resolver el problema.
Es difícil solucionar problemas por escrito sin acceso o soporte remoto, por lo que estoy un poco limitado aquí y desafortunadamente tengo que especular. No estoy seguro de qué otras opciones tendría, pero esas son algunas ideas rápidas.
$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"
POR ÚLTIMO
Cuando ejecuto el PS como dije anteriormente y lo abro con el bloc de notas solo para ver la lógica, lo construye en este formato con esta sintaxis, así que tal vez intente ejecutar esto en su Shell de administración de PS de Exchange y vea qué resultados obtiene. Si funciona de esta manera, entonces el problema tiene algo que ver con la ejecución del script, pero no recibe ningún error, pero tal vez esto también arroje algo de luz sobre el tema.
$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"}
Respuesta2
Después de esto, el script da un error.
While(!(Get-MailboxExportRequest -Mailbox $Exprot -Status Completed))
Parece que tienes un error de ortografía.
Reemplazar $Exprot
con $Export
:
While(!(Get-MailboxExportRequest -Mailbox $Export -Status Completed))