代码之家  ›  专栏  ›  技术社区  ›  StackBuck

导出和筛选365个用户邮箱大小结果按总大小从高到低排序

  •  0
  • StackBuck  · 技术社区  · 5 年前

    继续从我的 previous question


    结果包括“ 总尺寸 显示结果的列,并按名称后跟。

    “大于”25GB 结果,从高到低。

    enter image description here

    现在,有了 traditional way 使用 excel 之后 powershell导出。

    但是,我想把它放在CSV文件中,所以我不必一遍又一遍地做。

    以下是脚本:

    Param
    (
        [Parameter(Mandatory = $false)]
        [switch]$MFA,
        [switch]$SharedMBOnly,
        [switch]$UserMBOnly,
        [string]$MBNamesFile,
        [string]$UserName,
        [string]$Password
    )
    
    Function Get_MailboxSize
    {
     $Stats=Get-MailboxStatistics -Identity $UPN
     $IsArchieved=$Stats.IsArchiveMailbox
     $ItemCount=$Stats.ItemCount
     $TotalItemSize=$Stats.TotalItemSize
     $TotalItemSizeinBytes= $TotalItemSize –replace “(.*\()|,| [a-z]*\)”, “”
     $TotalSize=$stats.TotalItemSize.value -replace "\(.*",""
     $DeletedItemCount=$Stats.DeletedItemCount
     $TotalDeletedItemSize=$Stats.TotalDeletedItemSize
    
     #Export result to csv
     $Result=@{'Display Name'=$DisplayName;'User Principal Name'=$upn;'Mailbox Type'=$MailboxType;'Primary SMTP Address'=$PrimarySMTPAddress;'IsArchieved'=$IsArchieved;'Item Count'=$ItemCount;'Total Size'=$TotalSize;'Total Size (Bytes)'=$TotalItemSizeinBytes;'Deleted Item Count'=$DeletedItemCount;'Deleted Item Size'=$TotalDeletedItemSize;'Issue Warning Quota'=$IssueWarningQuota;'Prohibit Send Quota'=$ProhibitSendQuota;'Prohibit send Receive Quota'=$ProhibitSendReceiveQuota}
     $Results= New-Object PSObject -Property $Result  
     $Results | Select-Object 'Display Name','User Principal Name','Mailbox Type','Primary SMTP Address','Item Count',@{Name = 'Total Size'; Expression = {($_."Total Size").Split(" ")[0]}},@{Name = 'Unit'; Expression = {($_."Total Size").Split(" ")[1]}},'Total Size (Bytes)','IsArchieved','Deleted Item Count','Deleted Item Size','Issue Warning Quota','Prohibit Send Quota','Prohibit Send Receive Quota' | Export-Csv -Path $ExportCSV -Notype -Append
     
    }
    
    Function main()
    {
     #Check for EXO v2 module inatallation
     $Module = Get-Module ExchangeOnlineManagement -ListAvailable
     if($Module.count -eq 0) 
     { 
      Write-Host Exchange Online PowerShell V2 module is not available  -ForegroundColor yellow  
      $Confirm= Read-Host Are you sure you want to install module? [Y] Yes [N] No 
      if($Confirm -match "[yY]") 
      { 
       Write-host "Installing Exchange Online PowerShell module"
       Install-Module ExchangeOnlineManagement -Repository PSGallery -AllowClobber -Force
      } 
      else 
      { 
       Write-Host EXO V2 module is required to connect Exchange Online.Please install module using Install-Module ExchangeOnlineManagement cmdlet. 
       Exit
      }
     } 
    
     #Connect Exchange Online with MFA
     if($MFA.IsPresent)
     {
      Connect-ExchangeOnline
     }
    
     #Authentication using non-MFA
     else
     {
      #Storing credential in script for scheduling purpose/ Passing credential as parameter
      if(($UserName -ne "") -and ($Password -ne ""))
      {
       $SecuredPassword = ConvertTo-SecureString -AsPlainText $Password -Force
       $Credential  = New-Object System.Management.Automation.PSCredential $UserName,$SecuredPassword
      }
      else
      {
       $Credential=Get-Credential -Credential $null
      }
      Connect-ExchangeOnline -Credential $Credential
     }
    
     #Output file declaration 
     $ExportCSV=".\MailboxSizeReport_$((Get-Date -format yyyy-MMM-dd-ddd` hh-mm` tt).ToString()).csv" 
    
     $Result=""   
     $Results=@()  
     $MBCount=0
     $PrintedMBCount=0
     Write-Host Generating mailbox size report...
     
     #Check for input file
     if([string]$MBNamesFile -ne "") 
     { 
      #We have an input file, read it into memory 
      $Mailboxes=@()
      $Mailboxes=Import-Csv -Header "MBIdentity" $MBNamesFile
      foreach($item in $Mailboxes)
      {
       $MBDetails=Get-Mailbox -Identity $item.MBIdentity
       $UPN=$MBDetails.UserPrincipalName  
       $MailboxType=$MBDetails.RecipientTypeDetails
       $DisplayName=$MBDetails.DisplayName
       $PrimarySMTPAddress=$MBDetails.PrimarySMTPAddress
       $IssueWarningQuota=$MBDetails.IssueWarningQuota -replace "\(.*",""
       $ProhibitSendQuota=$MBDetails.ProhibitSendQuota -replace "\(.*",""
       $ProhibitSendReceiveQuota=$MBDetails.ProhibitSendReceiveQuota -replace "\(.*",""
       $MBCount++
       Write-Progress -Activity "`n     Processed mailbox count: $MBCount "`n"  Currently Processing: $DisplayName"
       Get_MailboxSize
       $PrintedMBCount++
      }
     }
    
     #Get all mailboxes from Office 365
     else
     {
      Get-Mailbox -ResultSize Unlimited | foreach {
       $UPN=$_.UserPrincipalName
       $Mailboxtype=$_.RecipientTypeDetails
       $DisplayName=$_.DisplayName
       $PrimarySMTPAddress=$_.PrimarySMTPAddress
       $IssueWarningQuota=$_.IssueWarningQuota -replace "\(.*",""
       $ProhibitSendQuota=$_.ProhibitSendQuota -replace "\(.*",""
       $ProhibitSendReceiveQuota=$_.ProhibitSendReceiveQuota -replace "\(.*",""
       $MBCount++
       Write-Progress -Activity "`n     Processed mailbox count: $MBCount "`n"  Currently Processing: $DisplayName"
       if($SharedMBOnly.IsPresent -and ($Mailboxtype -ne "SharedMailbox"))
       {
        return
       }
       if($UserMBOnly.IsPresent -and ($MailboxType -ne "UserMailbox"))
       {
        return
       }  
       Get_MailboxSize
       $PrintedMBCount++
      }
     }
    
     #Open output file after execution 
     If($PrintedMBCount -eq 0)
     {
      Write-Host No mailbox found
     }
     else
     {
      Write-Host `nThe output file contains $PrintedMBCount mailboxes.
      if((Test-Path -Path $ExportCSV) -eq "True") 
      {
       Write-Host `nThe Output file available in $ExportCSV -ForegroundColor Green
       $Prompt = New-Object -ComObject wscript.shell   
      $UserInput = $Prompt.popup("Do you want to open output file?",`   
     0,"Open Output File",4)   
      If ($UserInput -eq 6)   
       {   
        Invoke-Item "$ExportCSV"   
       } 
      }
     }
     #Disconnect Exchange Online session
     Disconnect-ExchangeOnline -Confirm:$false | Out-Null
    }
     . main
    

    0 回复  |  直到 5 年前
        1
  •  0
  •   Guy S    5 年前

    这是一个有点不幸的场景,但如果在每次迭代时都将结果输出到文件中,则有2个选项:

    1. 在脚本末尾,读取输出文件,过滤>25gb邮箱,对对象进行排序,然后再次输出
    2. 不是将用户邮箱写入每个用户的文件,而是保存到 变量。最后,过滤、排序,然后导出到文件

    不必过多地研究代码。。。

    可能是最简单的,因为您已经在使用两种输入大小。检索所有邮箱并获取所有统计信息后,读取导出的csv文件并对数据进行筛选和排序。然后,将信息导出回文件,覆盖。差不多

    $tempImport = Import-CSV $exportCSV | Where-Object {($_.'Total Size' -ge 25) -and ($_.Unit -eq "GB")} | Sort-Object 'Total Size' -descending
    $tempImport | Export-CSV $exportCSV -noTypeInformation
    

    选择2

    创建一个存储所有邮箱数据的活动变量,并在脚本末尾写入信息,而不是在每次迭代中打开文件以追加数据。然后,在脚本末尾,在导出之前进行筛选和排序。

    $global:largeMailboxes = @() # definition to allow reading through all functions
    

    然后,将结果添加到上述变量,而不是每次导出为CSV

    $tvar = $null
    $tvar = $Results | Select-Object 'Display Name','User Principal Name','Mailbox Type','Primary SMTP Address','Item Count',@{Name = 'Total Size'; Expression = {($_."Total Size").Split(" ")[0]}},@{Name = 'Unit'; Expression = {($_."Total Size").Split(" ")[1]}},'Total Size (Bytes)','IsArchieved','Deleted Item Count','Deleted Item Size','Issue Warning Quota','Prohibit Send Quota','Prohibit Send Receive Quota' 
    $global:largeMailboxes += $tvar
    # 
    # Alternatively, only add the mailbox if it's larger than 25GB, to avoid adding objects you don't care about
    if ($TotalItemSizeinBytes -ge 26843545600) # This is 25 GB, better to make a variable called $minSize or such to store this in, in case you want to change it later.
    {
        # Above code to add to global variable
    }
    

    添加所有邮箱后,对对象进行排序

    $global:largeMailboxes = $global:largeMailboxes | Sort-Object 'Total Size' -descending
    

    $global:largeMailboxes | Export-CSV $exportCSV -NoTypeInformation