paddyb79

Office 365 - eMail PS

Hallo Zusammen

ich versuche ne schöne Statistik aus Office 365 zu laden... das funktioniert soweit so gut aber ich möchte noch gerne was mit Eurer Hilfe optimieren

- Speed. Das Teil braucht für 760 Mailboxen ca. 2h, kann man dies optimieren?
Ich sortiere unten den Output, aber irgendwie kommt die Tabelle zuerst mit Grösse, Namen, eMail - ich hätte aber lieber Name, eMail und Grösse

$Result=@()
$mailboxes = Get-Mailbox -ResultSize Unlimited
$totalmbx = $mailboxes.Count
$i = 1
$mailboxes | ForEach-Object {
$i++
$mbx = $_
$mbs = Get-MailboxStatistics $mbx.UserPrincipalName

Write-Progress -activity "Processing $mbx" -status "$i out of $totalmbx completed"

if ($mbs.TotalItemSize -ne $null){
$size = [math]::Round(($mbs.TotalItemSize.ToString().Split('(')[1].Split(' ').Replace(',','')/1MB),2)
}else{
$size = 0 }

$Result += New-Object PSObject -property @{
Name = $mbx.DisplayName
UserPrincipalName = $mbx.UserPrincipalName
TotalSizeInMB = $size
}
}
$Result | Export-CSV "c:\tools\MailBox-Size.csv" -NoTypeInformation -Encoding UTF8
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 1269126356

Url: https://administrator.de/forum/office-365-email-ps-1269126356.html

Ausgedruckt am: 05.07.2025 um 08:07 Uhr

erikro
Lösung erikro 16.09.2021 um 19:01:58 Uhr
Goto Top
Moin,

zur Frage nach der Optimierung.

Das wird ersatzlos gestrichen. Warum alles in ein riesen Array von Ojekten schreiben, wenn Du es doch als CSV ausgeben willst.
 $Result=@() 

Soweit ok.
 $mailboxes = Get-Mailbox -ResultSize Unlimited
 $totalmbx = $mailboxes.Count
 $i = 1 

Nein. Wenn Du schnelle Skripte schreiben willst, dann nimm nicht Foreach-Object,
 $mailboxes | ForEach-Object {

sondern die echte Foreach-Schleife:
foreach($mbx in $mailboxes){ 

Die Zählervariable hast Du mit 1 initialisiert. D. h., wenn Du sie jetzt hochzählst, dann steht da 2 beim ersten Durchlauf. Aber Du machst das ja, damit Du auf dem Bildschirm siehst, wie weit er ist. Daher entweder die Variable mit 0 initialisieren oder am Ende der Schleife hochzählen.
 $i++

Das ist vollkommener Unsinn. Warum verdoppelst Du die Variable? Du könntest auch mit $_ weitermachen. Aber, wenn Du meinem Vorschlag folgst, dann hast Du die Daten ja schon in $mbx.
 $mbx = $_

OK
 $mbs = Get-MailboxStatistics $mbx.UserPrincipalName
 Write-Progress -activity "Processing $mbx" -status "$i out of $totalmbx completed"  
   
 if ($mbs.TotalItemSize -ne $null){
 $size = [math]::Round(($mbs.TotalItemSize.ToString().Split('(')[1].Split(' ').Replace(',','')/1MB),2)  
 }else{
 $size = 0 }

Und nun zum Wegschreiben. Du schreibst einfach jede einzelne Zeile in das CSV und sammelst sie nicht in erst in einem Array aus Objekten. Das spart Speicher und geht im Zweifel schneller:
 $Result = New-Object PSObject -property @{ 
 Name = $mbx.DisplayName
 UserPrincipalName = $mbx.UserPrincipalName
 TotalSizeInMB = $size
 }
 $Result | Export-CSV "c:\tools\$(get-date -format "yyMMdd")MailBox-Size.csv" -NoTypeInformation -Encoding UTF8 -append  
}

Warum allerdings die von Dir vorgegebene Reihenfolge vertauscht wird, ist mir schleierhaft.

Liebe Grüße

Erik

P.S.: Bitte Skripte in Code-Tags (Symbol </>) einschließen. Das liest sich leichter.
colinardo
Lösung colinardo 17.09.2021 aktualisiert um 11:50:23 Uhr
Goto Top
Und noch als weiterer Hinweis, das hier ist überflüssig, da TotalItemsize schon über eine entsprechende Methode zur Umwandlung in der Value Property besitzt
$size = [math]::Round(($mbs.TotalItemSize.ToString().Split('(')[1].Split(' ').Replace(',','')/1MB),2)

$mbs.TotalItemSize.Value.toMB()
Liefert schon das gewünschte und macht das Stringgewurschte überflüssig.

Als Einzeiler reduziert sich das ganze bspw. auf folgendes ...

Get-Mailbox -ResultSize unlimited | select @{n='Name';e={$_.DisplayName}},UserPrincipalName,@{n='TotalSizeInMB';e={(Get-MailboxStatistics $_.Alias).TotalItemSize.Value.toMB()}} | Export-CSV "c:\tools\MailBox-Size.csv" -Delimiter ";" -NoTypeInformation -Encoding UTF8  

Grüße Uwe