Benötige Hilfe in der Exchange Shell: Zwei Arrays und mit dem ersten prüfen, ob es im zweiten vorhanden ist
Hallo zusammen
Also, ich lege zwei Arrays in der Exchange Shell wie folgt an (MS Exchange Server 2010):
Das erste Array $accdoms sieht gekürzt so aus und enthält alle accepted Mail-Domains:
Das zweite Array $smtpadr sieht gekürzt so aus und enthält alle Mail Adressen (PrimarySMTPAddress):
Jetzt möchte ich mit dem ersten Element aus dem ersten Array (quasi $accdoms) prüfen, ob es Mail-Adressen mit dieser Domain (z.B. def.ch) im zweiten Array gibt.
Diese Mail-Adressen sollen grad in ein File geschrieben werden, welches def.ch.txt heissen soll. Je Domain ein File mit dem Domainnamen.txt.
Dabei sollen nur die Mail-Adressen vom Typ "User Mailbox" verarbeitet werden. Leider ist die "DistributionSearchMailbox" auch im zweiten Array drin.
Alles klar?
Was ich u.v.a. versucht habe:
Vielen Dank im Voraus!
Grüsse
Haru
Also, ich lege zwei Arrays in der Exchange Shell wie folgt an (MS Exchange Server 2010):
[array]$accdoms = @(Get-AcceptedDomain | select DomainName | sort DomainName | ft -HideTableHeaders)
[array]$smtpadr = @(Get-Mailbox | select PrimarySMTPAddress | sort PrimarySMTPAddress | ft -HideTableHeaders)
abc.ch
def.ch
uvw-xyz.ch
uhu@abc.ch
eule@abc.ch
audi@def.ch
fiat@def.ch
opel@def.ch
saab@def.ch
mars@uvw-xyz.ch
merkur@uvw-xyz.ch
Diese Mail-Adressen sollen grad in ein File geschrieben werden, welches def.ch.txt heissen soll. Je Domain ein File mit dem Domainnamen.txt.
Dabei sollen nur die Mail-Adressen vom Typ "User Mailbox" verarbeitet werden. Leider ist die "DistributionSearchMailbox" auch im zweiten Array drin.
Alles klar?
Was ich u.v.a. versucht habe:
ForEach ($dom in $accdoms) { Get-Mailbox | Where {$_.PrimarySMTPAddress -match "$dom"} | select Name, PrimarySMTPAddress | ft -HideTableHeaders }
Vielen Dank im Voraus!
Grüsse
Haru
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 256548
Url: https://administrator.de/forum/benoetige-hilfe-in-der-exchange-shell-zwei-arrays-und-mit-dem-ersten-pruefen-ob-es-im-zweiten-vorhanden-ist-256548.html
Ausgedruckt am: 09.04.2025 um 14:04 Uhr
11 Kommentare
Neuester Kommentar
Hallo Haru,
kein Problem:
andere Methode
Grüße Uwe
p.s. was mir bei deinem Codestil aufgefallen ist, ist das Speichern von Daten als pure Strings mit den Format-CMDLEts(format-table, etc.) in den Variablen. Dies bitte in Zukunft unbedingt vermeiden! Normalerweise verwendet man die Format-CMDLets wirklich nur zur Ausgabe in Dateien oder ähnlichem, nicht zum vergleichen etc. Man behält die Daten normalerweise so lange wie möglich als Objekte (ganz wichtige Powershell-Regel
).
-edit- 04.12.2014 18:21 - Code aktualisiert.
kein Problem:
$accdoms = Get-AcceptedDomain | select -Expand DomainName | select -Expand Address
$smtpadr = Get-Mailbox | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select PrimarySmtpAddress
$accdoms | %{$dom = $_; $smtpadr | ?{$_.PrimarySmtpAddress.Domain -eq $dom} | %{$_.PrimarySmtpAddress.toString()} | set-content "$dom.txt"}
$accdoms = Get-AcceptedDomain | select -Expand DomainName | select -Expand Address
$groups = Get-Mailbox | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select -ExpandProperty PrimarySmtpAddress | group Domain
$groups | ?{$accdoms -contains $_.Name} | %{$_.Group | set-content "$($_.Name).txt"}
p.s. was mir bei deinem Codestil aufgefallen ist, ist das Speichern von Daten als pure Strings mit den Format-CMDLEts(format-table, etc.) in den Variablen. Dies bitte in Zukunft unbedingt vermeiden! Normalerweise verwendet man die Format-CMDLets wirklich nur zur Ausgabe in Dateien oder ähnlichem, nicht zum vergleichen etc. Man behält die Daten normalerweise so lange wie möglich als Objekte (ganz wichtige Powershell-Regel
-edit- 04.12.2014 18:21 - Code aktualisiert.
Hallo Haru,
liegt an deiner verwendeten alten PS Version
Version 3.0 sollte es inzwischen schon sein ... , ist für mich als alten PS Hasen halt schon selbstverständlich, denke ich leider nicht immer dran 
Das hier sollte auch mit PS 2.0 laufen:
das Semikolon trennt einfach die Zeile von einer neuen ohne einen Zeilenumbruch zu machen.
Alles wird gut.
Grüße Uwe
liegt an deiner verwendeten alten PS Version
Das hier sollte auch mit PS 2.0 laufen:
$accdoms = Get-AcceptedDomain | select -ExpandProperty DomainName
$smtpadr = Get-Mailbox -ResultSize unlimited | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select -ExpandProperty PrimarySmtpAddress
$accdoms | %{$dom = $_;$smtpadr | ?{$_.toString().Split("@")[1] -eq $dom} | set-content "$dom.txt"}
In Zeile 3 ist ein ; (%{$dom = $_;$smtpadr). Geht das? Muss es nicht ein . sein?
Nein, das ist schon richtig so Alles wird gut.
Grüße Uwe
Ahh jetzt ich seh das Problem bei euch ... die kleinen Unterschiede zwischen den PS-Versionen nerven manchmal echt, sorry für die Umstände
Asche auf mein Haupt)
und für die andere Variante siehts dann so aus:
Grüße Uwe
$accdoms = Get-AcceptedDomain | select -Expand DomainName | select -Expand Address
$smtpadr = Get-Mailbox | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select PrimarySmtpAddress
$accdoms | %{$dom = $_; $smtpadr | ?{$_.PrimarySmtpAddress.Domain -eq $dom} | %{$_.PrimarySmtpAddress.toString()} | set-content "$dom.txt"}
$accdoms = Get-AcceptedDomain | select -Expand DomainName | select -Expand Address
$groups = Get-Mailbox | ?{$_.PrimarySmtpAddress -notmatch '[\{\}]'} | select -ExpandProperty PrimarySmtpAddress | group Domain
$groups | ?{$accdoms -contains $_.Name} | %{set-content "$($_.Name).txt" -Value $_.Group}
Hallo Haru,
du musst dich bei sowas schrittweise auf der Shell herantasten und dir den Inhalt von $_.Group anzeigen lassen, dann siehst du das es ein Array aus Objekten ist welches natürlich auch als solches behandelt werden will.
So wie deine Beschreibung klingt möchtest du vor jede E-Mail-Adresse ein Gleichheitszeichen setzen. In diesem Fall machst du das so:
Du musst also das Array erst auflösen bzw. über jeden Wert mit einer For-Each-Schleife itterieren %{} und entsprechend mit dem Gleichheitszeichen ausgeben
Das $_ repräsentiert dabei bei jedem Schleifendurchlauf den Wert der aktuellen Zeile des Arrays. Das ganze wird in den normalen Klammern erst aufgelöst, und dann an den -Value Parameter übergeben.
Grüße Uwe
du musst dich bei sowas schrittweise auf der Shell herantasten und dir den Inhalt von $_.Group anzeigen lassen, dann siehst du das es ein Array aus Objekten ist welches natürlich auch als solches behandelt werden will.
So wie deine Beschreibung klingt möchtest du vor jede E-Mail-Adresse ein Gleichheitszeichen setzen. In diesem Fall machst du das so:
$mgroups | ?{$accdoms -contains $_.Name} | %{set-content "C:\Temp\zepo\$($_.Name).txt" -Value ($_.Group | %{"=$_"})}
($_.Group | %{"=$_"})
Das $_ repräsentiert dabei bei jedem Schleifendurchlauf den Wert der aktuellen Zeile des Arrays. Das ganze wird in den normalen Klammern erst aufgelöst, und dann an den -Value Parameter übergeben.
Grüße Uwe