paddyb79
Goto Top

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

Content-Key: 1269126356

Url: https://administrator.de/contentid/1269126356

Printed on: April 23, 2024 at 22:04 o'clock

Member: erikro
Solution erikro Sep 16, 2021 at 17:01:58 (UTC)
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.
Member: colinardo
Solution colinardo Sep 17, 2021 updated at 09:50:23 (UTC)
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