我有一个正在运行的脚本,它被编程为对每个邮箱进行一个月的备份并将其存储到本地共享驱动器。当我运行脚本时,它会导出整个数据库而不是指定的日期范围。我不是程序员。我在 Google 上搜索了很多,但不是 100% 成功。我想要以下修改
我希望该脚本仅从特定数据库导出邮箱,而不是从所有数据库导出邮箱。我在脚本中尝试了“-Database Databasename”,但出现错误。
脚本应按月从上述数据库中导出所有邮箱。假设在 2015 年 12 月 9 日运行此脚本,则应导出 2015 年 11 月 9 日至 12 月 9 日的数据。日期必须根据编译日期自动更改。
脚本的底部不会在 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 文件
- 我希望该脚本仅从特定数据库导出邮箱,而不是从所有数据库导出邮箱。我在脚本中尝试了“-Database Databasename”,但出现错误。
- 脚本应按月从上述数据库中导出所有邮箱。假设在 2015 年 12 月 9 日运行此脚本,则应导出 2015 年 11 月 9 日至 12 月 9 日的数据。日期必须根据编译日期自动更改。
- 脚本的底部不会在 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")
因为您将获取从该日期到当前日期的数据。 - 必须将命令
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% 确定那里的问题,所以假设拼写错误,正如 David 建议的那样,除非对于问题#3。我提供的语法可以解决。)
POWERSHELL 示例脚本(管道循环)
(将所有 Exchange 邮箱从特定 Exchange DB 导出到文件共享的 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 管理 Shell 中运行,在 Exchange Server 上(而不是在 PS 中),请转到Start
--> Run
--> 并输入%Temp%
并按Enter。
从那里查看PS1
文件是否已命名,TempMBExport.ps1
并使用记事本打开它并查看逻辑。看看如果将该脚本中的内容复制到 Exchange PowerShell 管理控制台并按下 会发生什么Enter。
我不确定如果该文件不存在或者 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 管理 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))