Powershell: Zwei Bedingungen in einer if-Anweisung
Moin,
ich versuche mich aktuell gerade wieder einmal an einem Powershell-Skript.
Benötigt wird eine doppelte if-Bedingung, es müssen beide Bedingungen erfüllt sein, damit ein Befehl ausgelöst wird.
Ablauf: Künftige AD-User werden aus einer CSV-Datei ausgelesen, dort ist auch eine private Emailadresse hinterlegt, an die ein Text verschickt wird. Da ich ein äußerst höflicher Mensch bin, soll über das Attribut "weiblich / männlich" aus der CSV die Anrede in der Mail generiert werden: Sehr geehrte Frau / sehr geehrter Herr... Ich weiß, das ist nicht divers
Die CSV ist nach folgendem Muster aufgebaut:
MatrNr;Name;Vorname;Geschlecht;EMail;DisplayName
Entscheide ich die Mailanrede nur unter der Bedingung, dass die Spalte "Geschlecht" ausgewertet wird, klappt das alles super. Ich möchte aber verhindern, dass versehentlich doppelt Mails an einzelne Personen verschickt werden. Da ich die User mit demselben Skript anlege, habe ich also noch eine Kontrolle hinterlegt, ob es den User nicht bereits gibt.
Die Bedingungen möchte ich nun wie folgt auswerten:
Klappt aber nicht, es werden keine Mails verschickt. Ich vermute mal einen Fehler in meiner Syntax?
Das hier allein funktioniert, nimmt aber eben keine Rücksicht darauf, ob der User bereits existiert:
Und noch eine zweite Frage, muss ich eine if-Bedingung zwingend mit einer else-Bedingung beenden (bräuchte ich in diesem Fall nicht), oder ist das davon unabhängig?
Grüße!
ich versuche mich aktuell gerade wieder einmal an einem Powershell-Skript.
Benötigt wird eine doppelte if-Bedingung, es müssen beide Bedingungen erfüllt sein, damit ein Befehl ausgelöst wird.
Ablauf: Künftige AD-User werden aus einer CSV-Datei ausgelesen, dort ist auch eine private Emailadresse hinterlegt, an die ein Text verschickt wird. Da ich ein äußerst höflicher Mensch bin, soll über das Attribut "weiblich / männlich" aus der CSV die Anrede in der Mail generiert werden: Sehr geehrte Frau / sehr geehrter Herr... Ich weiß, das ist nicht divers
Die CSV ist nach folgendem Muster aufgebaut:
MatrNr;Name;Vorname;Geschlecht;EMail;DisplayName
Entscheide ich die Mailanrede nur unter der Bedingung, dass die Spalte "Geschlecht" ausgewertet wird, klappt das alles super. Ich möchte aber verhindern, dass versehentlich doppelt Mails an einzelne Personen verschickt werden. Da ich die User mit demselben Skript anlege, habe ich also noch eine Kontrolle hinterlegt, ob es den User nicht bereits gibt.
$Benutzer = $(try {Get-ADUser $user.MatrNr} catch {$Null})
Die Bedingungen möchte ich nun wie folgt auswerten:
if (($($user.Geschlecht) -eq "weiblich") -and $Benutzer -eq $Null)
Klappt aber nicht, es werden keine Mails verschickt. Ich vermute mal einen Fehler in meiner Syntax?
Das hier allein funktioniert, nimmt aber eben keine Rücksicht darauf, ob der User bereits existiert:
if ($($user.Geschlecht) -eq "weiblich")
Und noch eine zweite Frage, muss ich eine if-Bedingung zwingend mit einer else-Bedingung beenden (bräuchte ich in diesem Fall nicht), oder ist das davon unabhängig?
Grüße!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 1605044400
Url: https://administrator.de/contentid/1605044400
Ausgedruckt am: 24.11.2024 um 19:11 Uhr
15 Kommentare
Neuester Kommentar
Moin.
Versuch mal so:
S. hier:
https://www.computerperformance.co.uk/powershell/if-and/
Cheers,
jsysde
Versuch mal so:
if ($($user.Geschlecht) -eq "weiblich" -And $Benutzer -eq $Null))
https://www.computerperformance.co.uk/powershell/if-and/
[...]Und noch eine zweite Frage, muss ich eine if-Bedingung zwingend mit einer else-Bedingung beenden
Nein.Cheers,
jsysde
Moin,
Deine "-and"-Abfrage ist fehlerhaft. Aber das kann die jede x-beliebige Suchmaschine erklären.
Und was passiert, wenn das Userlein keine private Email-Adresse besitzt oder Sie nicht angeben will?
Darf es dann nicht bei euch arbeiten? Auch wenn es das Wundertier der Firma wäre?
Gruß
C.C.
Deine "-and"-Abfrage ist fehlerhaft. Aber das kann die jede x-beliebige Suchmaschine erklären.
Und was passiert, wenn das Userlein keine private Email-Adresse besitzt oder Sie nicht angeben will?
Darf es dann nicht bei euch arbeiten? Auch wenn es das Wundertier der Firma wäre?
Gruß
C.C.
$Benutzer -eq $Null
Ah ja, du willst also Mails schicken wenn es den User im AD nicht gibt? Du meintest wohl eher ein -neKaffee rüberschieb
Und noch eine zweite Frage, muss ich eine if-Bedingung zwingend mit einer else-Bedingung beenden (bräuchte ich in diesem Fall nicht), oder ist das davon unabhängig?
Das sollte man eigentlich selbst wissen, ist die Bedingung nicht erfüllt ist entweder der User nicht weiblich oder es gibt den User nicht. Die erste Prüfung sollte ja sein ob es den User gibt und erst dann sollte eine Verzweigung kommen ob dieser männlich oder weiblich ist.
Moin.
Mea culpa - Copy&Paste-Typo.
Cheers,
jsysde
Mea culpa - Copy&Paste-Typo.
Cheers,
jsysde
Zitat von @Coreknabe:
Die Bedingungen möchte ich nun wie folgt auswerten:
> if (($($user.Geschlecht) -eq "weiblich") -and $Benutzer -eq $Null)
$user.Geschlecht ist bereits genug. Ich würde auch nicht -eq bei Strings verwenden sondern entweder match oder like. Hatte bisher schräge Erfahrung mit -eq.
Mein Vorschlag:
if($null -eq $Benutzer){
if($user.Geschlecht -like "weiblich"){
#sendmail mit Anrede "sehr geehrte Frau"
}
if($user.Geschlecht -like "männlich"){
#sendmail mit Andrede "sehr geehrter Herr"
}
}
Zur Anmerkung: Encoding der CSV und Einlesen mit entsprechenden Encoding (bsp. "UTF8") immer kontrollieren, sonst wird das nix mit dem Matching!
Bei
$Benutzer = $(try {Get-ADUser $user.MatrNr} catch {$Null})
Der Vollständigkeithalber:
Aufpassen, dass die Matrikelnummer auch in einem (!) dieser Felder eingetragen ist:
- A distinguished name
- A SAM account name (sAMAccountName)
Zitat von @149569:
Ah ja, du willst also Mails schicken wenn es den User im AD nicht gibt? Du meintest wohl eher ein -ne
Ah ja, du willst also Mails schicken wenn es den User im AD nicht gibt? Du meintest wohl eher ein -ne
Nö, sein Script legt auch gleichzeitig die User an. OP hat geschrieben, dass er User anlegen will und wenn dies erfolgt ist, möchte er an die neuen User eine Mail versenden. Daher die Überprüfung, ob der User nicht eh bereits existiert.
---
Edit:
Wenn schon einen Einzeiler, dann jede Bedingung in Klammer, denn "who knows". 🤷♂️
if(($user.Geschlecht -like "weiblich") -and ($null -eq Benutzer))
Zitat von @Coreknabe:
@ptr2brain
Ups, Dein Edit gerade erst gesehen. Eine doppelte Umklammerung bringt's auch nicht...
Ich mache mich nächste Woche einmal daran, mein Skript auf Minimalgröße runterzudampfen, dann kann ich leichter testen. Das die Syntax für if falsch ist, vermute ich aber mal in erster Linie.
@ptr2brain
Ups, Dein Edit gerade erst gesehen. Eine doppelte Umklammerung bringt's auch nicht...
Ich mache mich nächste Woche einmal daran, mein Skript auf Minimalgröße runterzudampfen, dann kann ich leichter testen. Das die Syntax für if falsch ist, vermute ich aber mal in erster Linie.
Das sind viele überflüssige Subexpressions in deinen Zeilen drin aber die Syntax ist OK, ohne kompletten Kontext deines Skripts kann man nur raten, deshalb hier mal ein Beispiel, so läuft das hier problemlos
$users = @'
MatrNr;Name;Vorname;Geschlecht;EMail;DisplayName
1234;Muster;Max;männlich;user@domain.tld;Max Muster
'@ | ConvertFrom-CSV -Delimiter ";"
foreach($user in $users){
$anrede = "Sehr geehrter Herr $($user.Name)"
$aduser = Get-ADUser -Filter "SamAccountname -eq '$($user.MatrNr)'"
if (!$aduser){
if ($user.Geschlecht.trim() -eq 'weiblich'){
$anrede = "Sehr geehrte Frau $($user.Name)"
}
write-host "Sende mail an '$($user.Email)' ..."
# send-mailmessage or whatever comes here
}else{
write-host "User '$($user.DisplayName)' existiert bereits."
}
}
Tipp: Wenn du bei Get-ADUser einen "Filter" statt dem InputObject benutzt ist das Try-Catch Konstrukt übrigens überflüssig, denn dann schlägt die Abfrage nicht fehl sondern das Ergebnis der Variablen ist automatisch $null ohne getriggerten Fehler.
Zitat von @Coreknabe:
Hm, also bei mir funktioniert das so nicht, weil hier schon die if-Anweisung fehlt:
Nö tut sie nicht, du hast da nur einen gewaltigen Denkfehler 😉.Hm, also bei mir funktioniert das so nicht, weil hier schon die if-Anweisung fehlt:
Die Fehlermeldung verrät dir schon wo dein Problem liegt, du übergibt statt einem String ein custom object als SamAccountName.
Ergo ist deine CSV falsch formatiert bzw verwendet den falschen delimiter.
Hier funktioniert mein Skript ja einwandfrei 😉.
Zitat von @Coreknabe:
> $users = import-csv D:\User-Import\TEST.csv -delimiter ";"
>
- Encoding überprüft?
- Delimiter?
> if (!$aduser)
> {
> write-host "DIE FRAU MUSS ANGELEGT WERDEN!"
> }
>
> elseif ($($user.Geschlecht) -eq "weiblich")
> {
> write-host "ES IST EIN MÄDCHEN!"
> }
>
> if (!$aduser)
> {
> write-host "DER MANN MUSS ANGELEGT WERDEN!"
> }
>
> elseif ($($user.Geschlecht) -eq "maennlich")
> {
> write-host "ES IST EIN JUNGE!"
> }
> }
>
Auch wenn ich mich wiederhole, schau das du die Abfragen zusammenfasst:
if(!aduser){
Write-Host "User $user.DisplayName wird neu angelegt"
if($user.Geschlecht -like "weiblich"){
#sendmail mit Anrede "sehr geehrte Frau"
}
if($user.Geschlecht -like "männlich"){
#sendmail mit Andrede "sehr geehrter Herr"
}
}
else{
Write-Host "User $user.DisplayName wurde nicht gefunden"
}
Get-ADUser : Eigenschaft "MatrNr" wurde im Objekt vom Typ "System.Management.Automation.PSCustomObject" nicht gefunden.
In D:\Stud-Import\test.ps1:5 Zeichen:11
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADUser
DIE FRAU MUSS ANGELEGT WERDEN!
DER MANN MUSS ANGELEGT WERDEN!
In D:\Stud-Import\test.ps1:5 Zeichen:11
$aduser = Get-ADUser -Filter {SamAccountname -eq $user.MatrNr}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: ( [Get-ADUser], ArgumentException+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:System.ArgumentException,Microsoft.ActiveDirectory.Management.Commands.GetADUser
DIE FRAU MUSS ANGELEGT WERDEN!
DER MANN MUSS ANGELEGT WERDEN!
Fehlermeldung sagt eindeutig: In "MatrNr" ist kein Wert enthalten und aufgrund des Filter-Arguments, das keinen $null Wert erlaubt, hat er ein Problem. Das heißt, sei dir zuerst 100% sicher, dass dein CustomObject aus deiner CSV auch wirklich Daten enthält! Ansonsten musst du zuerst dein Input kontrollieren, bevor du damit weiterarbeiten kannst.
Ah vergessen, bei manchen AD Versionen will der Filter-String in der Formatierung nicht in dem Fall musst du die Get-ADUser Zeile so schreiben dann klappts auch bei den Nachbarn , sorry:
$aduser = Get-ADUser -Filter "SamAccountname -eq '$($user.MatrNr)'"