
56921
26.07.2010 um 13:14:10 Uhr
Emailadressen aus String parsen (per Batch)
Hallo,
ich bin gerade etwas ratlos, wie ich aus einem String eine Emailadresse herausparsen kann. Schwierigkeit ist dabei, dass die Strings nicht in einem eindeutigem Format vorliegen, sondern z.B. so:
Bisher habe ich das hier probiert, was mir zumindest schon mal den Domainpart liefert:
Mein Problem ist der Hostpart, da ich ja gerade bei Leerzeichen nicht weiß, wieviele Tokens dazu vorhanden sind.
Ich wäre für eine Lösung (oder eine Idee für eine Lösung
) sehr dankbar!
Gruß,
Carsten
ich bin gerade etwas ratlos, wie ich aus einem String eine Emailadresse herausparsen kann. Schwierigkeit ist dabei, dass die Strings nicht in einem eindeutigem Format vorliegen, sondern z.B. so:
- From: "Horst Schlemmer" <horst@schlemmer.de>
- From: Horst Schlemmer aus Grevenbroich <horst@schlemmer.de>
- From: <horst@schlemmer.de>
- From: "horst@schlemmer.de"
- From: horst@schlemmer.de
Bisher habe ich das hier probiert, was mir zumindest schon mal den Domainpart liefert:
FOR /F "tokens=1,2* delims=@" %%I IN ('FINDSTR /R ^From: %FULLPATH%\%FILENAME%') DO CALL :set_var_once "%%I" "%%J"
Mein Problem ist der Hostpart, da ich ja gerade bei Leerzeichen nicht weiß, wieviele Tokens dazu vorhanden sind.
Ich wäre für eine Lösung (oder eine Idee für eine Lösung
Gruß,
Carsten
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147665
Url: https://administrator.de/forum/emailadressen-aus-string-parsen-per-batch-147665.html
Ausgedruckt am: 18.04.2025 um 22:04 Uhr
8 Kommentare
Neuester Kommentar
Hallo carsten-h,
hier ein Vorschlag zur Lösung Deines Problems:
Die Zeichen <, >, " und & werden aus dem String herausgefiltert (< nur beim ersten Teil, der den Host enthält, > nur beim zweiten Teil, der die Domain enthält). Vor der EMail-Adresse muss dann ein Leerzeichen stehen, danach auch ein Leerzeichen oder der String muss direkt zu Ende sein.
[Edit]
Die o.g. Zeichen können zwar Bestandteil einer EMail-Adresse sein, aber hast Du sowas in der Liste?
Gruß
Friemler
hier ein Vorschlag zur Lösung Deines Problems:
@echo off
setlocal enabledelayedexpansion
FOR /F "tokens=1,2* delims=@" %%I IN ('FINDSTR /R ^From: %FULLPATH%\%FILENAME%') DO (
set "p1=%%I"
set "p2=%%J"
set p1=!p1:"=!
set p2=!p2:"=!
set "p1=!p1:<=!"
set "p2=!p2:>=!"
set "p1=!p1:&=!"
set "p2=!p2:&=!"
call :getadr "!p1!" "!p2!"
echo !address!
)
exit /b
endlocal
:getadr
setlocal
set "hst=%~1"
set "dom=%~2"
:loop1
set chr=%hst:~-1%
if "%chr%" neq " " set host=%chr%%host%
set hst=%hst:~0,-1%
if "%chr%" neq " " goto loop1
:loop2
set chr=%dom:~0,1%
if "%chr%" neq " " set domain=%domain%%chr%
set dom=%dom:~1%
if "%dom%" neq "" if "%chr%" neq " " goto loop2
endlocal & set address=%host%@%domain%
exit /b
Die Zeichen <, >, " und & werden aus dem String herausgefiltert (< nur beim ersten Teil, der den Host enthält, > nur beim zweiten Teil, der die Domain enthält). Vor der EMail-Adresse muss dann ein Leerzeichen stehen, danach auch ein Leerzeichen oder der String muss direkt zu Ende sein.
[Edit]
Die o.g. Zeichen können zwar Bestandteil einer EMail-Adresse sein, aber hast Du sowas in der Liste?
Gruß
Friemler
Hallo carsten-h,
also mein erster Vorschlag wäre:
- Kann das Programm, was diese Dateien mit Email-Adressen erzeugt, diese nicht in ein(e) geordnete(s) und immer
wiederkehrende(s) Form/Format bringen?
Das würde im Anschluss einen "Kleinzeiler" erzeugen, der dir die Adressen dann rausfiltert und das ganze mit ganz wenig Mühe.
Also wenn diese Möglichkeit besteht, würde ich hier erst einmal an der "Quelle schrauben".
Gruss
Tsuki
also mein erster Vorschlag wäre:
- Kann das Programm, was diese Dateien mit Email-Adressen erzeugt, diese nicht in ein(e) geordnete(s) und immer
wiederkehrende(s) Form/Format bringen?
Das würde im Anschluss einen "Kleinzeiler" erzeugen, der dir die Adressen dann rausfiltert und das ganze mit ganz wenig Mühe.
Also wenn diese Möglichkeit besteht, würde ich hier erst einmal an der "Quelle schrauben".
Gruss
Tsuki
ansonsten hätte ich auch noch etwas verrücktes in VBS anzubieten:
Gruss
Tsuki
Dim Filter
MeineDatei = "C:\Email.txt"
Filter = Array("<",">",Chr(34))
Set FSO = CreateObject("Scripting.FileSystemObject")
MeineZeilen = Split(FSO.OpenTextFile(MeineDatei, 1).ReadAll,vbCrLF)
For i = 0 to Ubound(MeineZeilen)
temp = split(MeineZeilen(i) , " ")
For j = 0 to Ubound(temp)
temp1 = Split(temp(j), "@")
If Ubound(temp1) > 0 then
MeineEmail = Join(temp1 , "@")
For k = 0 to Ubound(Filter)
MeineEmail = Replace(MeineEmail,Filter(k),"")
Next
Msgbox MeineEmail
j = Ubound(temp)
End If
Next
Next
Gruss
Tsuki
da in einer Emailadresse keine Leerzeichen vorkommen und es immer der letzte Teil String ohne Leerzeichen ist, könnte es auch kürzer gehen.
gültige Zeichen in einer Mailadresse sind
A-Za-z0-9.!#$%&'*+-/=?^_`{|}~
hier sind aber Eventuelle Leerzeichen hinter dem letzten String berücksichtigt.
die Sprungmarke :Mail ist nur eingefügt, da die Platzhalter in der Forschleife in Zeile 10 eine Datei suchen würden.
@Friemler
das & brauchst Du doch nicht herausfiltern...
Gruß Phil
gültige Zeichen in einer Mailadresse sind
A-Za-z0-9.!#$%&'*+-/=?^_`{|}~
hier sind aber Eventuelle Leerzeichen hinter dem letzten String berücksichtigt.
@echo off & setlocal
set fullpath=D:\Adminhelp
set filename=Testdokument.txt
FOR /f "tokens=1*" %%i IN ('FINDSTR /b /c:"From:" "%FULLPATH%\%FILENAME%"') do (
set "Mail=%%j"
setlocal enabledelayedexpansion
set "Mail=!Mail:"=!"
set "Mail=!Mail:<=!"
set "Mail=!Mail:>=!"
echo "!Mail!"|findstr /v "* ?">nul&&(for %%k in ("!Mail: =" "!") do echo "%%~k"|find "@">nul&&set "Mail=%%~k")||call :Mail
echo "!Mail!"|find "@">nul&&echo !Mail!
endlocal
)
pause>nul&goto :eof
:Mail
if not "!Mail:* =!" == "!Mail!" echo "!Mail:* =!"|find "@">nul&&(set "Mail=!Mail:* =!"&goto :Mail)
@Friemler
das & brauchst Du doch nicht herausfiltern...
Gruß Phil
Moin Friemler,
ja das ist wirklich ein klein wenig äähm Erklärungsbedürftig...
ja das ist wirklich ein klein wenig äähm Erklärungsbedürftig...
echo "!Mail!"|findstr /v "* ?">nul
FINDSTR gibt eine Erfolgsmeldung wenn KEINE * oder ? in der Variable Zeile gefunden werden - ansonsten keine Erfolgsmeldung (%ERRORLEVEL%>0)da die Schleife
for %k in ("abc*") do echo %k...
for %k in ("abc?") do echo %k...
das aktuelle Verzeichnis nach Namen abc.... bzw abc. durchsucht fasst es leider in die Grütze, wenn in der Variable die Platzhalterzeichen ? * (Fragezeichen, Sternchen) enhalten sind.for %k in ("abc?") do echo %k...
es kann ja sein in der Variable ist es doch drin - wenn ja wird der String halt in der Subroutine bearbeitet halt nur langsamer.
for %%k in ("!Variable: =" "!") do ....
die Variable anstelle der Leerzeichen mit einem Anführungszeichen davor und danach anzeigen, damit ich in der Laufvariable %%k zum Beispiel "Herr&Mann" stehen habe oder "Susi(Susann)" diese Ausfilterung in der Forschleife geht doch zig mal schnellerfor %i in (a b c d) do echo %i...
geht ja noch wie gewollt - aberfor %i in (a(abc) b c) do echo %i...
geht net mehr - daher sofor %i in ("a(abc)" "b" "c") do echo %i
Gruß Phil