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
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
Please also mark the comments that contributed to the solution of the article
Content-Key: 1269126356
Url: https://administrator.de/contentid/1269126356
Printed on: April 26, 2024 at 08:04 o'clock
2 Comments
Latest comment
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.
Soweit ok.
Nein. Wenn Du schnelle Skripte schreiben willst, dann nimm nicht Foreach-Object,
sondern die echte Foreach-Schleife:
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.
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.
OK
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:
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.
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.
Und noch als weiterer Hinweis, das hier ist überflüssig, da TotalItemsize schon über eine entsprechende Methode zur Umwandlung in der Value Property besitzt
Liefert schon das gewünschte und macht das Stringgewurschte überflüssig.
Als Einzeiler reduziert sich das ganze bspw. auf folgendes ...
Grüße Uwe
$size = [math]::Round(($mbs.TotalItemSize.ToString().Split('(')[1].Split(' ').Replace(',','')/1MB),2)
$mbs.TotalItemSize.Value.toMB()
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