我已经使用Powershell四个月了,并且学习了一些基本知识,例如如何循环使用csv,创建函数,导出等。但是,我正在尝试使其变得更加复杂,并开始为我目前工作的公司构建一个Leavers脚本。到目前为止,到目前为止,我设法在自动的情况下编译了一个工作脚本:导入包含用户名的初始CSV,然后将其循环并在目标位置上创建文件夹。接下来是邮箱导出(在这里我实际上需要帮助以及本文的目的) ),一切都很好,但问题是它使每个人都从CSV循环,并迫使Exchange一次导出所有内容。我不喜欢这样,因为它过度利用了服务器,并且我看到较大的邮箱失败,所以我决定尝试建立一个队列,邮箱被逐个导出。
这是我当前正在使用的功能,它可以一次将每个人推送:
$dest = "%\Desktop\#SCRIPTS\Modules\Exports\Temp\Target.csv"
$targetStorage = "\\SERVER\Targetfolders"
$Connection = "http://Exchange-Server.companydomain.com/PowerShell/"
Set-ExecutionPolicy RemoteSigned
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri $Connection -Authentication Kerberos -Credential $UserCredential
Import-PSSession $Session
#########################################################################
$mails = Import-Csv $dest
ForEach ($mail in $mails)
{
New-MailboxExportRequest -Mailbox "$($mail.Name)@CompanyDomain.com" -FilePath "$($targetStorage)\$($mail.Name)\$($mail.Name).pst" | Out-Null
}
这是我昨天想到的:
$dest = "%\Desktop\#SCRIPTS\Modules\Exports\Temp\Target.csv"
$targetStorage = "\\SERVER\Targetfolders"
$Connection = "http://Exchange-Server.companydomain.com/PowerShell/"
$mails = Import-Csv $dest
ForEach ($mail in $mails) {
Get-MailboxExportRequest -Mailbox $mail.Name
if (Get-MailboxExportRequest -Status InProgress) {
Write-Host "Mailboxes are still exporting, do not cancel the script!!"
}
else { Get-MailboxExportRequestStatistics -Identity $mail.Name | **Some-Cmdlet** -Like 'PercentComplete' -eq '100' | New-MailboxExportRequest -Mailbox $mail.Name -FilePath "$($synStorage)\$($mail.Name)\$($mail.Name).pst"}
}
在此脚本上,我添加了“ somecmdlet”-“ PercentComplete” -eq“ 100”,其中100表示从Get-MailboxExportRequestStatistics导出的百分比,因此当上一个导出达到100%时,执行下一个导出CSV。
有什么想法可以用来标记PercentComplete家伙的cmdlet吗?
Name StatusDetail SourceAlias PercentComplete
---- ------------ ----------- ---------------
MailboxExport Completed Dummy.User 100
很抱歉,我的帖子很长,但我试图使其尽可能清楚:)
谢谢!
========================== 根据Xiakit的建议进行编辑:=========================
$mails = Import-Csv $dest
ForEach ($mail in $mails) {
Get-MailboxExportRequest -Mailbox $mail.Name
if (Get-MailboxExportRequest -Status InProgress) {
Write-Host "Mailboxes are still exporting, do not cancel the script!!"
}
else {
New-MailboxExportRequest -Mailbox $mail.Name -FilePath "$($synStorage)\$($mail.Name)\$($mail.Name).pst"
while($requeststatus.status -notlike "Completed"){
Start-Sleep -seconds 10
$RequestStatus = Get-MailboxExportRequest -Identity $mail.Name
}
}
}
但是脚本结束并且永不循环:(输出:
Mailboxes are still exporting, do not cancel the script!!
Name Mailbox Status
---- ------- ------
MailboxExport ommited/Enterprise/Users/Vlatko Completed
MailboxExport1 ommited/Enterprise/Users/Vlatko Completed
MailboxExport2 ommited/Enterprise/Users/Vlatko InProgress
MailboxExport omitted/Enterprise/Users/Dummy User Queued
MailboxExport omitted/Enterprise/Users/Dummy User Queued
MailboxExport omitted/Enterprise/Users/Dummy User Queued
Mailboxes are still exporting, do not cancel the script!!
答案 0 :(得分:0)
还有一个Get-MailboxExportRequest,您可以检查请求是否完成:
while($requeststatus.status -notlike "Completed"){
Start-Sleep -seconds 10
$RequestStatus = Get-MailboxImportRequest -Identity "whatever"
}
只要您的请求没有完成,这就会循环。
答案 1 :(得分:0)
最后,我也想向TechNet寻求帮助,因为他们当然是Microsoft,他们应该知道每个Powershell问题的答案:)非常感谢Xiakit为解决我的问题所做的努力(关于自启动以来,我仍然很想解决这个问题,我想完成它),但是这是使Mailbox Exports排队的解决方案:
$mails = Import-Csv $dest
ForEach ($mail in $mails) {
New-MailboxExportRequest -Mailbox $mail.Name -FilePath "$($synStorage)\$($mail.Name)\$($mail.Name).pst"
do {
Write-Host "Queued"
Start-Sleep -s 5
} while(Get-MailboxExportRequest -Mailbox $mail.Name -Status Queued)
do {
Write-Host "InProgress"
Start-Sleep -s 5
} while(Get-MailboxExportRequest -Mailbox $mail.Name -Status InProgress)
If(Get-MailboxExportRequest -Mailbox $mail.Name -Status Complete){
Write-Host "A export request complete"
Get-MailboxExportRequest | Remove-MailboxExportRequest -Confirm:$false
}
If(Get-MailboxExportRequest -Mailbox $mail.Name -Status Failed){
Write-Host "A error occur"
}
}
希望这对其他试图为他们的多个用户自动化其离职流程的管理员会派上用场!
感谢支持!
Vlatko