Geburtstagsliste per Batch versenden
Hi Leute,
Ich möchte gerne aus einer Geburtstagsliste die im CSV Format vorliegt eine Email generieren, die mir alle Geburtstage von HEUTE schickt.
Dazu habe ich diesen Beitrag gefunden, der von @bastla elegant gelöst wurde: Geburtstags-Mails an alle Mitarbeiter versenden.
Nun konnte ich rausfinden, dass ich aus meiner Adressdatenbank eine CSV Liste in folgendem Format rausbekommen kann:
19.04.1981;Nachname;Vorname
10.11.1973;Nachname;Vorname
Nun ist es grundsätzlich kein Problem die Felder innerhalb der Delimiter in der DO Schleife auszulesen, wie in dem Beitrag beschrieben!
Die Selektion
funktioniert aber nur, wenn ich das Jahr aus der CSV rauslösche oder die Punkte des Datims gegen Semikolons ersetzte.
Das funktioniert zwar ist nun nicht besonders elegant!
Kann mir eventuell jemand helfen wie ich das Datum und das Jahr aus dem CSV in getrennte Variablen INNERHALB der Schleife bekomme ohne mein CSV File verändern zu müssen?
Ich möchte gerne aus einer Geburtstagsliste die im CSV Format vorliegt eine Email generieren, die mir alle Geburtstage von HEUTE schickt.
Dazu habe ich diesen Beitrag gefunden, der von @bastla elegant gelöst wurde: Geburtstags-Mails an alle Mitarbeiter versenden.
Nun konnte ich rausfinden, dass ich aus meiner Adressdatenbank eine CSV Liste in folgendem Format rausbekommen kann:
19.04.1981;Nachname;Vorname
10.11.1973;Nachname;Vorname
Nun ist es grundsätzlich kein Problem die Felder innerhalb der Delimiter in der DO Schleife auszulesen, wie in dem Beitrag beschrieben!
Die Selektion
set "heute=%date:~,6%"
for /f "tokens=1-3 delims=;" %%a in ('findstr "%heute%;" "%WorkDir%\GebListe.txt"') do >>"%WorkDir%\Geburtstage.txt" echo %%c%%b am %%a
funktioniert aber nur, wenn ich das Jahr aus der CSV rauslösche oder die Punkte des Datims gegen Semikolons ersetzte.
Das funktioniert zwar ist nun nicht besonders elegant!
Kann mir eventuell jemand helfen wie ich das Datum und das Jahr aus dem CSV in getrennte Variablen INNERHALB der Schleife bekomme ohne mein CSV File verändern zu müssen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 972418647
Url: https://administrator.de/forum/geburtstagsliste-per-batch-versenden-972418647.html
Ausgedruckt am: 17.05.2025 um 07:05 Uhr
19 Kommentare
Neuester Kommentar
Moin,
wenn es auch eine Powershell sein darf:
birthday.csv
doBirthday.ps1
Ergebnis:
Mit dem Powershell CmdLet Send-MailMessage() kannst du dann deine Ergebnisliste - wie auch immer aufbereitet - per Mail versenden.
Vermutlich geht das auch etwas eleganter...
<edit>
Ich habe mal noch einen Datenschutz-Aspekt oben ergänzt "Spalte Agreed". Wenn eine Person der Verteilung zugestimmt hat (=1), wird diese in der Ausgabe berücksichtigt.
Wenn das für dein Vorhaben irrelevant ist, lasse einfach in der CSV die letzte "Spalte" weg und entferne us dem PS-Befehl oben
Hier eine Hilfe, um aus obigem dann direkt eine schöne Mail zu versenden:
https://social.technet.microsoft.com/Forums/windows/en-US/95e3abab-289a- ...
Das könnte ich zwar oben einarbeiten, aber ein wenig Spaß am Lernen möchte ich dir,@pblacky, ja auch nicht nehmen
</edit>
Gruß
em-pie
wenn es auch eine Powershell sein darf:
birthday.csv
Date;Firstname;Lastname;Aggreed
11.07.1954;Gretel;Müller;1
25.05.1984;Michael;Mustermann;0
31.12.2000;Max;Meier;1
30.09.1997;Laura;Schmitt;1
11.07.1881;Wilhelm;Kayser;0
doBirthday.ps1
$list = "C:\tmp\birthday.csv"
$bdtoday = Import-Csv -Path $list -Delimiter ";" |
Select-Object -Property *, @{label = "Age"; expression = {(Get-Date -Format "yyyy") - (Get-Date ($_.Date) -Format "yyyy") - 1}} |
Where-Object {(Get-Date ($_.Date) -Format "dd.MM") -match (Get-Date -Format "dd.MM") -and $_.Agreed -eq 1}
Ergebnis:
Date Firstname Lastname Agreed Age
---- --------- -------- ------ ---
11.07.1954 Gretel Müller 1 66
Mit dem Powershell CmdLet Send-MailMessage() kannst du dann deine Ergebnisliste - wie auch immer aufbereitet - per Mail versenden.
Vermutlich geht das auch etwas eleganter...
<edit>
Ich habe mal noch einen Datenschutz-Aspekt oben ergänzt "Spalte Agreed". Wenn eine Person der Verteilung zugestimmt hat (=1), wird diese in der Ausgabe berücksichtigt.
Wenn das für dein Vorhaben irrelevant ist, lasse einfach in der CSV die letzte "Spalte" weg und entferne us dem PS-Befehl oben
-and $_.Agreed -eq 1
Hier eine Hilfe, um aus obigem dann direkt eine schöne Mail zu versenden:
https://social.technet.microsoft.com/Forums/windows/en-US/95e3abab-289a- ...
Das könnte ich zwar oben einarbeiten, aber ein wenig Spaß am Lernen möchte ich dir,@pblacky, ja auch nicht nehmen
</edit>
Gruß
em-pie
Zitat von @pblacky:
Grundsätzlich freue ich mich über jede Lösung die funktioniert, danke dafür!
Auch wenn ein Lerneffekt damit verbunden ist
Nie schlecht Grundsätzlich freue ich mich über jede Lösung die funktioniert, danke dafür!
Auch wenn ein Lerneffekt damit verbunden ist
Allerdings habe ich Powershell noch nie verwendet, da ich ein ein sehr komplexes automatisches System über Batch auf meinem Rechner laufen habe.
Muss mich erst schlau machen ob und wie ich Powershell skripte darüber automatisch ausführen kann....
alles nicht so schwer:Muss mich erst schlau machen ob und wie ich Powershell skripte darüber automatisch ausführen kann....
Powershell.exe "c:\tmp\doBirthday.ps1"
Powershell.exe -executionpolicy bypass -File "c:\tmp\doBirthday.ps1"
Kann dein PScript das was du mir als Ergebnis hier darstellst in eine TXT Datei abspeichern?
GehtDenn für das Senden habe ich bereits ein Modul, das textdateien.txt verschicken kann und bereits fertig ist 
$list = "C:\tmp\birthday.csv"
$outfile = "c:\tmp\result.txt"
Import-Csv -Path $list -Delimiter ";" |
Select-Object -Property *, @{label="Age"; expression = {(Get-Date -Format "yyyy") - (Get-Date ($_.Date) -Format "yyyy") - 1}} |
Where-Object {(Get-Date ($_.Date) -Format "dd.MM") -match (Get-Date -Format "dd.MM") -and $_.Agreed -eq 1} |
Format-Table |
Out-File -FilePath $outfile
Beachte meine obige Änderung noch, bzgl. der Agreed-Spalte!
Zitat von @pblacky:
Kann es leider nicht ausführen, es blitzt kurz ein Fenster auf und verschwindet dann wieder!
Wenn ich das Skript direkt in der gestarteten Powershell ausführe, dann kommt das:
c:\Temp\doBirthday.ps1 : Die Datei "C:\Temp\doBirthday.ps1" kann nicht geladen werden, da die Ausführung von Skripts
auf diesem System deaktiviert ist. Weitere Informationen finden Sie unter "about_Execution_Policies"
(https:/go.microsoft.com/fwlink/?LinkID=135170).
In Zeile:1 Zeichen:1
c:\Temp\doBirthday.ps1
~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : Sicherheitsfehler: (
, PSSecurityException
FullyQualifiedErrorId : UnauthorizedAccess
Muss gestehen habe auf dem Rechner noch nie ein Powershell ausgeführt, habe auch keine Ahnung warum das nicht klappt !?
Kann es leider nicht ausführen, es blitzt kurz ein Fenster auf und verschwindet dann wieder!
Wenn ich das Skript direkt in der gestarteten Powershell ausführe, dann kommt das:
c:\Temp\doBirthday.ps1 : Die Datei "C:\Temp\doBirthday.ps1" kann nicht geladen werden, da die Ausführung von Skripts
auf diesem System deaktiviert ist. Weitere Informationen finden Sie unter "about_Execution_Policies"
(https:/go.microsoft.com/fwlink/?LinkID=135170).
In Zeile:1 Zeichen:1
c:\Temp\doBirthday.ps1
~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo : Sicherheitsfehler: (
FullyQualifiedErrorId : UnauthorizedAccess
Muss gestehen habe auf dem Rechner noch nie ein Powershell ausgeführt, habe auch keine Ahnung warum das nicht klappt !?
Es geift - richtigerweise - eine Sicherheitsfunktion innerhalb von WIndows/ der Powershell, die verhindert, das jemand ein ps1-Script "im Hintergrund" "per Doppelklick" öffnen kann. Schaue dir daher oben meinen zweiten Funktionsaufruf an.
Wenn der klappt, lies dich in den Text hinter diesem Link ein:
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell. ...

Zitat von @Scirca:
Man könnte auch einen Eintrag in sein Email Kalender machen und sowas wie wiederholender Termin eintragen. Also jährlich dann braucht man sich dafür nicht so ein lustig Skript basteln.
Man könnte auch einen Eintrag in sein Email Kalender machen und sowas wie wiederholender Termin eintragen. Also jährlich dann braucht man sich dafür nicht so ein lustig Skript basteln.
Solche Geburtstagskalender sind in Unternehmen kritisch zu betrachten, was die dsgvo betrifft.
Hier noch mal komplett, sollte dir die Zeile 1 (die Spaltenüberschriften) fehlen:
birthday.csv
doBirthday.ps1
Ergebnis:
birthday.csv
12.07.1954;Gretel;Müller;1
25.05.1984;Michael;Mustermann;0
31.12.2000;Max;Meier;1
30.09.1997;Laura;Schmitt;1
12.07.1881;Wilhelm;Kayser;0
doBirthday.ps1
$list = "C:\tmp\birthday.csv"
$outfile = "c:\tmp\result.txt"
Import-Csv -Path $list -Delimiter ";" -Header "Birthdate", "Firstname", "Lastname", "Agreed" |
Select Agreed,Firstname,Lastname,Birthdate,@{label="Age"; expression = {(Get-Date -Format "yyyy") - (Get-Date ($_.Birthdate) -Format "yyyy") - 1}} |
Where-Object {(Get-Date ($_.Birthdate) -Format "dd.MM") -match (Get-Date -Format "dd.MM") -and $_.Agreed -eq 1} |
Format-Table |
Out-File -FilePath $outfile
Ergebnis:
Date Firstname Lastname Agreed Age
---- --------- -------- ------ ---
12.07.1954 Gretel Müller 1 66
Hey, damit man Geburtstagsgeschenke besorgen kann oder eben der erste ist, der gratuliert -
sollte man ggf. 14 Tage vor dem Geburtstag erinnert werden, bzw. 14 Tage nach dem Geburtstag noch eine Meldung erhalten (man kann ja im Urlaub sein usw.) Jedenfalls berücksichtige ich soetwas bei der Programmierung... (Gut... gibt auch noch Tierkreiszeichen... die man mit ausgeben kann... aber das denke ich ist zu viel des guten.)
Gruß.
sollte man ggf. 14 Tage vor dem Geburtstag erinnert werden, bzw. 14 Tage nach dem Geburtstag noch eine Meldung erhalten (man kann ja im Urlaub sein usw.) Jedenfalls berücksichtige ich soetwas bei der Programmierung... (Gut... gibt auch noch Tierkreiszeichen... die man mit ausgeben kann... aber das denke ich ist zu viel des guten.)
Gruß.