Top-Themen

Aktuelle Themen (A bis Z)

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

Frage Entwicklung Batch & Shell

GELÖST

Emailadressen aus String parsen (per Batch)

Mitglied: 56921

56921 (Level 1)

26.07.2010 um 13:14 Uhr, 5099 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 ..
Ähnliche Inhalte
Batch & Shell
Batch String bzw. Textdatei mittels Regex durchsuchen und String ausgeben
gelöst Frage von aysxdcBatch & Shell3 Kommentare

Hallo, ich möchte mit einer Batch eine Datei durchsuchen. Z. B: Ich will nach "ProjectCompatibilityVersion=" suchen um auf den ...

Sonstige Systeme
Software zum Parsen von Emails und PDFs
Frage von Zero01Sonstige Systeme12 Kommentare

Hallo, ich suche für die Firma bei der ich zur Zeit arbeite eine Software mit der man Emails und ...

Batch & Shell
Ini file powershell parse
gelöst Frage von kotb92Batch & Shell3 Kommentare

Hallo zusammen, Ich habe ein paar solche 'ini' Dateien die ich mit Powershell in eine csv Datei parsen möchte. ...

Windows 7
Microsoft.NET Framework Parser Konfigurationsfehler
gelöst Frage von DasJulianWindows 72 Kommentare

Schönen guten Tag alle zusammen, und zwar bin ich heute früher von meiner Arbeit nachhause gekommen und wollte dann ...

Neue Wissensbeiträge
Linux

Meltdown und Spectre: Linux Update

Information von Frank vor 2 TagenLinux

Meltdown (Variante 3 des Prozessorfehlers) Der Kernel 4.14.13 mit den Page-Table-Isolation-Code (PTI) ist nun für Fedora freigegeben worden. Er ...

Tipps & Tricks

Solutio Charly Updater Fehlermeldung: Das Abgleichen der Dateien in -Pfad- mit dem Datenobject ist fehlgeschlagen

Tipp von StefanKittel vor 3 TagenTipps & Tricks

Hallo, hier einmal als Tipp für alle unter Euch die mit der Zahnarztabrechnungssoftware Charly von Solutio zu tun haben. ...

Sicherheit

Meltdown und Spectre: Wir brauchen eine "Abwrackprämie", die die CPU-Hersteller bezahlen

Information von Frank vor 3 TagenSicherheit12 Kommentare

Zum aktuellen Thema Meltdown und Spectre: Ich wünsche mir von den CPU-Herstellern wie Intel, AMD oder ARM eine Art ...

Sicherheit

Meltdown und Spectre: Realitätscheck

Information von Frank vor 3 TagenSicherheit12 Kommentare

Die unangenehme Realität Der Prozessorfehler mit seinen Varianten Meltdown und Spectre ist seit Juni 2017 bekannt. Trotzdem sind immer ...

Heiß diskutierte Inhalte
Firewall
Penetrationstester-Labor - Firewalls
Frage von Oli-nuxFirewall10 Kommentare

Mich würde interessieren warum man beim Einrichten eines Penetrationstester-Labor (VMs) die Firewall der Systeme deaktivieren soll? Hat das nur ...

SAN, NAS, DAS
Wer kennt sich mit QNAP und CISCO aus ?
gelöst Frage von MachelloSAN, NAS, DAS9 Kommentare

Hallo Zusammen hier im Forum, Ich habe ein QNas 451+ und dieses NAS hat zwei GBit Lan Adapter die ...

Netzwerkgrundlagen
IPv6 Inter-VLAN Routing
gelöst Frage von clSchakNetzwerkgrundlagen9 Kommentare

Hi ich befasse mich gerade mit der Implementierung von IPv6 was bisher (in einem VLAN) korrekt funktioniert inkl. DNS ...

Windows Netzwerk
Zugriff auf den Desktop Ordner eines anderen Rechners in der gleichen Domäne
gelöst Frage von JensNomaWindows Netzwerk6 Kommentare

Guten Abend, ich war neulich mit unserem Admin am Tisch gesessen. Er an seinem Notebook angemeldet mit dem Domänen-Admin, ...