Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Emailadressen aus String parsen (per Batch)

Frage Entwicklung Batch & Shell

Mitglied: 56921

56921 (Level 1)

26.07.2010 um 13:14 Uhr, 4991 Aufrufe, 8 Kommentare

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:
  1. From: "Horst Schlemmer" <horst@schlemmer.de>
  2. From: Horst Schlemmer aus Grevenbroich <horst@schlemmer.de>
  3. From: <horst@schlemmer.de>
  4. From: "horst@schlemmer.de"
  5. From: horst@schlemmer.de
usw.

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 ) sehr dankbar!

Gruß,
Carsten
Mitglied: Friemler
26.07.2010 um 15:39 Uhr
Hallo carsten-h,

hier ein Vorschlag zur Lösung Deines Problems:

01.
@echo off 
02.
 
03.
setlocal enabledelayedexpansion 
04.
 
05.
 
06.
FOR /F "tokens=1,2* delims=@" %%I IN ('FINDSTR /R ^From: %FULLPATH%\%FILENAME%') DO ( 
07.
  set "p1=%%I" 
08.
  set "p2=%%J" 
09.
   
10.
  set p1=!p1:"=! 
11.
  set p2=!p2:"=! 
12.
   
13.
  set "p1=!p1:<=!" 
14.
  set "p2=!p2:>=!" 
15.
 
16.
  set "p1=!p1:&=!" 
17.
  set "p2=!p2:&=!" 
18.
 
19.
  call :getadr "!p1!" "!p2!" 
20.
   
21.
  echo !address! 
22.
23.
 
24.
exit /b 
25.
 
26.
endlocal 
27.
 
28.
 
29.
 
30.
:getadr 
31.
setlocal 
32.
 
33.
set "hst=%~1" 
34.
set "dom=%~2" 
35.
   
36.
:loop1 
37.
  set chr=%hst:~-1% 
38.
  if "%chr%" neq " " set host=%chr%%host% 
39.
  set hst=%hst:~0,-1% 
40.
if "%chr%" neq " " goto loop1 
41.
 
42.
 
43.
:loop2 
44.
  set chr=%dom:~0,1% 
45.
  if "%chr%" neq " " set domain=%domain%%chr% 
46.
  set dom=%dom:~1% 
47.
if "%dom%" neq "" if "%chr%" neq " " goto loop2 
48.
 
49.
 
50.
endlocal & set address=%host%@%domain% 
51.
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
Bitte warten ..
Mitglied: TsukiSan
27.07.2010 um 05:19 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
27.07.2010 um 05:40 Uhr
....ansonsten hätte ich auch noch etwas verrücktes in VBS anzubieten:
01.
Dim Filter 
02.
 
03.
MeineDatei = "C:\Email.txt" 
04.
Filter = Array("<",">",Chr(34)) 
05.
 
06.
Set FSO = CreateObject("Scripting.FileSystemObject") 
07.
MeineZeilen = Split(FSO.OpenTextFile(MeineDatei, 1).ReadAll,vbCrLF)  
08.
 
09.
For i = 0 to Ubound(MeineZeilen) 
10.
	temp = split(MeineZeilen(i) , " ") 
11.
	For j = 0 to Ubound(temp) 
12.
		temp1 = Split(temp(j), "@") 
13.
		If Ubound(temp1) > 0 then 
14.
			MeineEmail = Join(temp1 , "@") 
15.
			For k = 0 to Ubound(Filter) 
16.
				MeineEmail = Replace(MeineEmail,Filter(k),"") 
17.
			Next 
18.
			Msgbox MeineEmail 
19.
			j = Ubound(temp) 
20.
		End If 
21.
	Next 
22.
 
23.
Next
Gruss
Tsuki
Bitte warten ..
Mitglied: pieh-ejdsch
27.07.2010 um 14:13 Uhr
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.
01.
@echo off & setlocal 
02.
set fullpath=D:\Adminhelp 
03.
set filename=Testdokument.txt 
04.
FOR /f "tokens=1*" %%i IN ('FINDSTR /b /c:"From:" "%FULLPATH%\%FILENAME%"') do ( 
05.
	set "Mail=%%j" 
06.
	setlocal enabledelayedexpansion 
07.
	set "Mail=!Mail:"=!" 
08.
	set "Mail=!Mail:<=!" 
09.
	set "Mail=!Mail:>=!" 
10.
	echo "!Mail!"|findstr /v "* ?">nul&&(for %%k in ("!Mail: =" "!") do echo "%%~k"|find "@">nul&&set "Mail=%%~k")||call :Mail 
11.
	echo "!Mail!"|find "@">nul&&echo !Mail! 
12.
	endlocal 
13.
14.
pause>nul&goto :eof 
15.
:Mail 
16.
if not "!Mail:* =!" == "!Mail!" echo "!Mail:* =!"|find "@">nul&&(set "Mail=!Mail:* =!"&goto :Mail)
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
Bitte warten ..
Mitglied: Friemler
28.07.2010 um 13:21 Uhr
Hallo pieh-ejdsch,

Zeile 10 ist ja eine echte Breitseite, verliere doch noch mal ein paar Worte darüber, was Du Dir dabei gedacht hast/wie es funktioniert.

Gruß
Friemler
Bitte warten ..
Mitglied: pieh-ejdsch
28.07.2010 um 16:15 Uhr
Moin Friemler,

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)

&& Befehl wird nur ausgeführt, wenn der vorherige Befehl erfolgreich war || Dieser Befehl wird nur ausgeführt, wenn der Vorherige Nicht Erfolgreich war

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.
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 schneller
for %i in (a b c d) do echo %i...
geht ja noch wie gewollt - aber
for %i in (a(abc) b c) do echo %i...
geht net mehr - daher so
for %i in ("a(abc)" "b" "c") do echo %i

Gruß Phil
Bitte warten ..
Mitglied: Friemler
29.07.2010 um 01:50 Uhr
Hallo pieh-ejdsch,

danke für die Erklärung. Ich habe Deinen Code ausführlich getestet und kann sagen, daß er in allen Fällen fehlerfrei gelaufen ist. Gute Arbeit.


ACHTUNG! Ich poste den Code von pieh-ejdsch hier nochmal in einer besser lesbaren Form, der Algorithmus ist aber NICHT von mir!


01.
@echo off 
02.
 
03.
setlocal enabledelayedexpansion 
04.
 
05.
set "fullpath=%cd%" 
06.
set "filename=emails.txt" 
07.
 
08.
for /f "tokens=1*" %%i IN ('findstr /b /c:"From:" "%fullpath%\%filename%"') do ( 
09.
  set "Mail=%%j" 
10.
 
11.
  set "Mail=!Mail:"=!" 
12.
  set "Mail=!Mail:<=!" 
13.
  set "Mail=!Mail:>=!" 
14.
 
15.
  rem Enthält die Zeile Wildcards? 
16.
  echo "!Mail!"|findstr /v "* ?" > NUL 
17.
 
18.
  if !errorlevel! equ 0 ( rem Keine Wildcards 
19.
    for %%k in ("!Mail: =" "!") do ( 
20.
      echo "%%~k"|find "@" > NUL 
21.
      if !errorlevel! equ 0 set "Mail=%%~k" 
22.
23.
  ) else ( rem Mit Wildcards 
24.
    call :ParseLineWithWildcards 
25.
26.
 
27.
  echo "!Mail!"|find "@" > NUL 
28.
  if !errorlevel! equ 0 echo !Mail! 
29.
30.
 
31.
endlocal 
32.
 
33.
echo. 
34.
pause 
35.
exit /b 
36.
 
37.
 
38.
:ParseLineWithWildcards 
39.
if not "!Mail:* =!" equ "!Mail!" ( 
40.
  echo "!Mail:* =!"|find "@" > NUL 
41.
 
42.
  if !errorlevel! equ 0 ( 
43.
    set "Mail=!Mail:* =!" 
44.
    goto :ParseLineWithWildcards 
45.
46.
)
Gruß
Friemler
Bitte warten ..
Mitglied: 56921
30.07.2010 um 10:28 Uhr
Zitat von Friemler:
Hallo pieh-ejdsch,

danke für die Erklärung.

Dem kann ich mich nur anschließen! Funktioniert super! Respekt!

Danke & Gruß,
Carsten
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (10)

Frage von clragon zum Thema Batch & Shell ...

C und C++
gelöst Anzahl der Buchstaben in einem String Element Array C++ (3)

Frage von Protected zum Thema C und C ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...