smiley
Goto Top

Findstr schreibt nur den Zeilenanfang bis Leerzeichen. Zu suchende Zeichenkette korrekt.

Was ist denn unter einem "persönlichem" Vorwort zu verstehen? Soll ich meine Computervorgeschichte hier reinschreiben? Schreiben wer ich bin und was ich tuhe? Mich vorstellen, eben? Ich schreibe hier kein Buch. Das ist eine einfache Frage. Wozu werde ich genötigt ein Vorwort zu verfassen?
Das ist nicht von belang. Wo ist da der Sinn?

Naja,
zu meinem Problem:

Ich wollte, um mir die Arbeit zu vereinfachen, nicht jede IP eines kopierten Textes einzeln rauskopieren, sondern "findstr" die Anweisung geben, dieses zu tun. Manchmal sind es mehr als 60 IPs und da ist mir der Aufwand zu groß.
Die IPs stehen nicht am Zeilenanfang. Das hängt mit Seite zusammen von der ich sie kopiere.

Das sieht dann in etwa so aus:
12/16 62.104.179.121:27015 [Launch] surf_ski_2 8029 14917 5 417 33m37s 176km (109mi) Hamburg, 04 95.03% 0

Ich habe mit folgendem Code probleme die IP rauszukopieren:

del "C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
for /f %%i in ('findstr /C ".*\..*\..*\..*:....." "C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"') do ECHO %%i >>"C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
Pause

Ausgabe in der ips.txt:
12/16

Wenn ich per Hand die Angabe: 12/16 entferne schreibt er mir die IP rein. Aber dann könnte ich mir das auch sparen.

Warum hängt er sich also daran auf?
Ich hab es auch schon mit /R, /L, usw versucht, aber das bringt nichts.
Bitte um Hilfe.

MfG

Content-ID: 134221

Url: https://administrator.de/forum/findstr-schreibt-nur-den-zeilenanfang-bis-leerzeichen-zu-suchende-zeichenkette-korrekt-134221.html

Ausgedruckt am: 26.12.2024 um 12:12 Uhr

bastla
bastla 24.01.2010 um 16:05:31 Uhr
Goto Top
Hallo Smiley!

"findstr" arbeitet zeilenorientiert - insofern erhältst Du immer zum Suchbegriff passende ganze Zeilen.

Zerlegt wird dann mittels "for /f" anhand von Trennzeichen ("Delimitern") - wenn Du also nur die IP-Adresse (ohne Portangabe) benötigst, wären die passenden Trennzeichen das Leerzeichen (nach "12/16") und der Doppelpunkt (vor dem Port) und der gesuchte Teil ("Token") hat die laufende Nummer 2:
for /f "tokens=2 delims=: " %%i ...
Grüße
bastla

P.S.: Falls "findstr" überhaupt nötig sein sollte (weil nicht in jeder Zeile eine Adresse steht), wäre "/C" durch "/R" zu ersetzen (bzw ersatzlos zu entfernen) ...
Smiley
Smiley 24.01.2010 um 19:12:43 Uhr
Goto Top
Was hat "for" mit "findstr" zu tun? Ich dachte "findstr" gibt mir das gefundene aus und "for" ist bloß ne Schleife damit er das in der nächsten Zeile auch macht.
Was mache ich wenn ich 2 Trennzeichen benötige? Also das erste Leerzeichen und nach dem Port das nächste. Den Port brauch ich nämlich auch.

Hm ich teste mal kruz ein bischen rum mit "delims".

Danke erstmal.
Smiley
Smiley 24.01.2010 um 19:16:47 Uhr
Goto Top
Ich les gerade das:
delims=xxx - gibt einen Satz von Trennzeichen an, das ersetzt die Standardtrennzeichen TAB und Leerzeichen.
Also trennt er doch beim Leerzeichen.
Wieso brauche ich überhaupt Token?
bastla
bastla 24.01.2010 um 19:26:47 Uhr
Goto Top
Hallo Smiley!
Ich dachte "findstr" gibt mir das gefundene aus
Macht es auch - allerdings immer die komplette Zeile - was Du ja leicht testen kannst, indem Du es ohne "for" verwendest, also:
findstr ".*\..*\..*\..*:....." "C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"
Also trennt er doch beim Leerzeichen.
Nur, wenn keine Trennzeichen angegeben sind oder (wie in meinem Ansatz) das Leerzeichen explizit in den "Satz" aufgenommen wird.

Wenn Du den Port auch behalten willst, wird das Trenzeichen ":" nicht benötigt - dann genügt das (defaultmäßige) Leerzeichen:
for /f "tokens=2" %%i ...
Wieso brauche ich überhaupt Token?
Die "Tokens" sind die Ergebnisse der Trennung - aus Deinem Beispiel entstehen bei Trennung anhand der Leerzeichen :
Token-NrInhalt
1 12/16
2 62.104.179.121:27015
3 [Launch]
4 surf_ski_2
5 ... 8029 14917 5 417 33m37s 176km (109mi) Hamburg, 04 95.03% 0
Davon willst Du nur die Nr. 2 ...

Grüße
bastla
Smiley
Smiley 25.01.2010 um 16:01:50 Uhr
Goto Top
Aaah, jetzt hab ich verstanden. Also lass ich delims weg, weil es nur Leerzeichen sind. Gut.

Jetzt habe ich aber noch das Problem, dass manchmal nach dem dritten Leerzeichen erst die IP geschrieben steht:
0/32 (1) 87.106.84.31:27038 [Launch] deathrun_insane 2972 5460 182 202 612s 160km (99mi) , 89.94% 0

Hier gibt er halt nur (1) aus.
"tokens=2,3" funktioniert nicht. Auch "tokens=2,3" oder "2,3,4,5,6,7,8" ändert nichts daran. (Und wäre auch sinnlos.)

Ich verstehe nicht warum es nicht eine einfache Methode dafür gibt... bin doch bestimmt nicht der einzige der eine Liste von IPs benötigt, die er wo anders rauskopiert hat. Ich denke das das in großen Netzwerken bestimmt auch nötig ist, oder in irgendwelchen Firewalls. Nagut, meistens laufen die dann unter Linux etc., aber warum gibt es keine möglichkeit mit "findstr" so etwas zu verwirklichen? Hätte doch bestimmt nicht viel Programmierzeit gekostet und benötigen tuts man immer wieder.

Falls es interessiert: Die Liste von IPs bekomme ich von folgender Seite: www.game-monitor.com
Da kann man Server für Spiele suchen, was bei CS1.6 sinn ergibt, weil man das ingame nur eingeschränkt kann. (Langsam, findet eig. nichts.) Die Liste mit den reinen IPs füge ich dann in HLSW (Half Life Server Watch) ein und habe dort meine, Map abhängigen(!), Listen. Das wäre nur mit HLSW nicht so zu erreichen.

MfG
Biber
Biber 25.01.2010 um 16:41:44 Uhr
Goto Top
Moin Smiley,

Ich verstehe nicht warum es nicht eine einfache Methode dafür gibt...
bin doch bestimmt nicht der einzige der eine Liste von IPs benötigt, die er wo anders rauskopiert hat.
"Nomen est omen", wie die alten Griechen sagten.... ich finde das toll, dass du trotz Montag so entspannt und flauschig bleibst.
Muss an deinem Sonnenscheinchen-Nick liegen.

Zur Ehrenrettung der Redmonder Skiddies muss ich aber jetzt einwerfen
  • erstens könnte der FindStr-befehl auch durchaus mit Regular Expressions hantieren... und wenn halt (formal betrachtet) zwei "Satzarten" in dieser IP-Liste vorkommen können (mal mit einer zweiten Spalte "(n)" und einer dritten Spalte "Ip:Port" und mal "Sätze" mit dem IP:port-Wert in der zweiten Spalte... ließe sich auch über Findstr trennen und dann halt die IP aus Spalte 2 oder Spalte 3 holen.
  • zweitens ist es aber mit zwei FOR-Anweisungen hintereinander schneller gemacht als ein Nachschlagen der RegExp-Syntax am CMD-Prompt dauert.

Angenommen, wir hätten irgendwo die eine Zeile aus deinem Beispiel griffbereit in einer Variable %oneLine%:
SET "oneLine=0/32 (1) 87.106.84.31:27038 [Launch] deathrun_insane 2972 5460 182 202 612s 160km (99mi) , 89.94% 0"  

... nur, damit ich es vorturnen kann am CMD-Prompt natürlich; das erste ">" nicht mit eingeben, is' sich mein Prompt:
>FOR /F "tokens=*" %z in ("%oneline%") do @FOR %i in (%z) do @echo %i|find ":" && @echo set "theIp=%i"  

set "theIp=87.106.84.31:27038"  
Diese CMD-Oneliner fieselt aus der ganzen Zeile das "Token" raus, das den Doppelpunkt [zwischen IP und Port] enthält und macht damit irgendwas, hier dargestellt durch das Anzeigen von [SET "theIP=%i"]

Geht also schon alles relativ stressarm... das Werkzeug CMD sieht nur so klobig aus....

Grüße
Biber
bastla
bastla 25.01.2010 um 16:48:54 Uhr
Goto Top
...und wenn womöglich später in der Zeile noch ein Doppelpunkt vorhanden wäre, kannst Du mit (diesmal wieder Batch-Schreibweise)
set "theIP="  
FOR /F "tokens=*" %%z in ("%oneline%") do @FOR %%i in (%%z) do @echo %%i|find ":" && if not defined theIp set "theIp=%%i"  
dafür sorgen, dass das erste Vorkommen verwendet wird.

Grüße
bastla
Smiley
Smiley 25.01.2010 um 18:59:10 Uhr
Goto Top
Aaaah.

Jetzt geht es:
del "C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
FOR /F "tokens=*" %%z in ('findstr ".*\..*\..*\..*:....." "C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"') do @for %%i in (%%z) do @echo %%i|find ":" && ECHO %%i >>"C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"
Pause

Läuft zwar ein bischen langsam, aber eine IP pro Sekunde ist immernoch schneller als selbst rauskopieren und man kann während dessen was anderes machen.
Es sei denn, du weist wie man es schneller hinbekommt. ?

MfG
bastla
bastla 25.01.2010 um 19:10:43 Uhr
Goto Top
Hallo Smiley!
Es sei denn, du weist wie man es schneller hinbekommt. ?
Etwa, indem das "findstr" vermieden wird - brauchst Du das tatsächlich? Wenn jede Zeile eine Adresse enthielte, ließe sich das Ganze schon mal auf
@echo off & setlocal
set "Ein=C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"  
set "Aus=C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"  

del "%Aus%" 2>nul  
FOR /F "usebackq tokens=*" %%z in ("%Ein%") do FOR %%i in (%%z) do echo %%i|find ":" && ECHO %%i >>"%Aus%"  
reduzieren ...

Grüße
bastla
Smiley
Smiley 25.01.2010 um 19:49:15 Uhr
Goto Top
Ist natürliche eine viel coolere Methode. face-smile Aber die ist auch nicht schneller. "Find" scheint das Problem zu sein.

MfG
bastla
bastla 25.01.2010 um 20:17:55 Uhr
Goto Top
Hallo Smiley!

Wenn's wirklich flott sein soll, hast Du mit Batch denn doch nicht unbedingt die besten Voraussetzungen - versuch's mal mit VBS:
EinDatei = "C:\Dokumente und Einstellungen\xxx\Desktop\ipliste.txt"  
AusDatei = "C:\Dokumente und Einstellungen\xxx\Desktop\ips.txt"  

Set rE = New RegExp
rE.Global = True
rE.Pattern = " \d+\.\d+\.\d+\.\d+\:\d+ "  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = fso.OpenTextFile(EinDatei).ReadAll

Set Aus = fso.CreateTextFile(AusDatei)
For Each Result In rE.Execute(T)
    Aus.WriteLine Trim(Result.Value)
Next
Aus.Close
Grüße
bastla
Biber
Biber 25.01.2010 um 20:27:53 Uhr
Goto Top
@bastla
[OT]
Guck doch mal kurz nach ganz oben in den Eröffnungsbeitrag
Da steht:
...Manchmal sind es mehr als 60 IPs und da ist mir der Aufwand zu groß.

Ja hey! Dann lass den Quatsch doch eine gefühlte Sekunde pro Zeile dauern. So what?
Er muss doch bei einem Batch nicht die Tastatur festhalten, bis die letzte Zeile durchgenudelt ist...
Oder hast du da ein "Bitte warten..." -Fenster eingebaut, dass ihn in seinen Bann zieht?

Ich glaube, das ist das, was unsere Vizekanzlerin immer als Jammern auf hohem Niveau bezeichnet....

Grüße
Biber
[/OT]
bastla
bastla 25.01.2010 um 20:38:05 Uhr
Goto Top
[OT]
@Biber
"Mehr als 60" bedeutet doch: nach oben offen face-wink

Die 2 Minuten mehr (im Vergleich zu einer auf das Mengengerüst Bezug nehmenden Antwort - die es aber fast ohnehin geworden wäre) für das Script hatte ich dann auch noch - und außerdem: Wir wollen hier doch über den Anlassfall hinausdenken und zukünftigen Generationen etwas hinterlassen ... face-wink

Grüße
bastla
[/OT]
Biber
Biber 25.01.2010 um 21:00:03 Uhr
Goto Top
[nochmal OT]
@bastla
Zitat von @bastla:
"Mehr als 60" bedeutet doch: nach oben offen face-wink
Oh nein... keine sinnentstellenden Zitate bitte: "Manchmal sind es mehr als 60 IPs...", nicht im Durchschnitt.
und zusätzlich kann es auch sein, dass es ihm nur wie 60 IPs vorkam... so wie vorhin die eine 1 Sekunde pro "Find"-Aufruf..*gg
Wahrscheinlich liefen nebenbei zwei DVD-vom-Netz-auf-Brenner-Schaufel-Aufgaben...

Die 2 Minuten mehr (im Vergleich zu einer auf das Mengengerüst Bezug nehmenden Antwort - die es aber fast ohnehin geworden wäre) für das Script
Na ja... andererseits....
Für die Abarbeitung dieser 60 verträumten IP-Zeilen von einem Game-Server haben ein paar unbezahlbar gute Skript-Virtuosen genauso viele Skript-Zeilen aus der Tastatur geschüttelt... Ob das volkswirtschaftlich vertretbar ist...?
... und zukünftigen Generationen etwas hinterlassen ... face-wink
Und wenn die kommenden Generationen noch verwöhnter sind?? face-wink

Grüße
bastla

Grüße zurück
Biber
[/ nochmal OT]
bastla
bastla 25.01.2010 um 21:49:56 Uhr
Goto Top
[immer noch OT]
@Biber
Oh nein... keine sinnentstellenden Zitate bitte: "Manchmal sind es mehr als 60 IPs...", nicht im Durchschnitt.
Was bist Du heute wieder streng - ah so, is ja noch immer Montach ...
Für die Abarbeitung dieser 60 verträumten IP-Zeilen von einem Game-Server haben ein paar unbezahlbar gute Skript-Virtuosen genauso viele Skript-Zeilen aus der Tastatur geschüttelt... Ob das volkswirtschaftlich vertretbar ist...?
Unter diesem Aspekt (insbes hinsichtlich Game-Server) dürfte der Thread eigentlich schon gar nicht mehr existieren ...
... aber sieh's mal so: vielleicht kann er ein anderes Mal noch so 20, 30 Adressen damit rausholen - dann muss es uns das schon wert gewesen sein ... face-wink
Und wenn die kommenden Generationen noch verwöhnter sind?? face-wink
Wieso beschleicht mich das Gefühl, dass Du die Fragezeichen hättest einsparen können?

So gesehen kann ich eigentlich nur noch mein Substandard-Script rechtzeitig wieder einstampfen (gut, dass ich immer die recyclebaren Bytes verwende face-wink) ...

Grüße
bastla
[/immer noch OT]
Smiley
Smiley 26.01.2010 um 17:01:05 Uhr
Goto Top
@Biber, bastla

Zitat von @bastla:
... aber sieh's mal so: vielleicht kann er ein anderes Mal noch so 20, 30 Adressen damit rausholen - dann muss es uns das
schon wert gewesen sein ... face-wink
>Und wenn die kommenden Generationen noch verwöhnter sind??
Wieso beschleicht mich das Gefühl, dass Du die Fragezeichen hättest einsparen können?

Hm, eure Kritik ist nicht ohne Sinn für den richtigen Moment und Verstand ... Trotz allem ist mein Anliegen eher der, zu lernen - scheint es auch noch so paradox, 105 Gameserver zur Verfügung zu haben und von "Lernen" zu sprechen. face-smile
Ich werde nie jeden dieser Server besuchen oder auch nur jeden Namen lesen. Du, bastla, hast mir mehr damit geholfen dieses Script zu verstehen, als damit, mir (Als Spielfigur), nun auf mehr als 60 Servern den Himmel auf den Kopf fallen zu lassen, wenn ich mal nicht aufpasse. (Es ist nicht immer Falsch, dies wortwörtlich zu verstehen.)

Bla, geschwurbel, bla ... Es wär nett wenn du mir hilfst das VBS Script zu verstehen, was aber nicht unbedingt notwendig ist, da ich VBS eig. nicht verwende.
Es funktioniert nicht, zeigt auch keine Fehlermeldung an, aber schreibt ips.txt neu, jedoch ohne Inhalt.

"T = fso.OpenTextFile(EinDatei).ReadAll " Ist das T nicht eine Variable; muss es deshalb nicht hinter "Set" stehen? Schreibe ich "Set" davor zeigt er mir einen Fehler. (Ojekt erforderlich Zeile 9 [da befindet sich das "T"] string .....)
Außerdem zeigt mir KEINEN Fehler an, wenn ich hier draus: "For Each Result In rE.Execute(T); Aus.WriteLine Trim(Result.Value)", das mache: "For Each Result In rE.Execute(T); Aus.WriteKSTAKGJHEKLKVine Trim(Result.Value)", was bedeutet, dass der "Executor", wenn man das so schreiben kann, nicht bis dahin kommt.
Was ist hier eigenltich der Befehl, der den Text nach "rE.Pattern" durchsucht? "rE.Pattern" wird ja nur deklariert und liegt gelangweil in der Mitte, oder nicht?

MFG
bastla
bastla 26.01.2010 um 17:34:31 Uhr
Goto Top
Hallo Smiley!
Es funktioniert nicht, zeigt auch keine Fehlermeldung an, aber schreibt ips.txt neu, jedoch ohne Inhalt.
Kann eigentlich nur darauf zurückzuführen sein, dass keine Adressen gefunden werden, was wiederum als mögliche Ursachen einen unrichtigen RegEx oder unpassende Ausgangsdaten (zB weil in Unicode) haben könnte ...

Da Du lernen willst, vorweg zu Deinen Fragen:
"T = fso.OpenTextFile(EinDatei).ReadAll " Ist das T nicht eine Variable; muss es deshalb nicht hinter "Set" stehen?
T ist eine Stringvariable, keine Objektvariable - daher kein "Set" - und enthält den gesamten Dateiinhalt der "EinDatei".
Außerdem zeigt mir KEINEN Fehler an, wenn ich hier draus: "For Each Result In rE.Execute(T); Aus.WriteLine Trim(Result.Value)", das mache: "For Each Result In rE.Execute(T); Aus.WriteKSTAKGJHEKLKVine Trim(Result.Value)", was bedeutet, dass der "Executor", wenn man das so schreiben kann, nicht bis dahin kommt.
"Nicht bis dahin" ist nicht ganz richtig - wenn kein passender Text gefunden wird, läuft die (abweisende) Schleife nur einfach 0-mal ...
Was ist hier eigenltich der Befehl, der den Text nach "rE.Pattern" durchsucht?
Das Durchsuchen erfolgt mittels "rE.Execute(T)" - die Ergebnisse (wenn es denn welche gibt) werden dann mit der "For Each"-Schleife durchlaufen.
"rE.Pattern" wird ja nur deklariert und liegt gelangweil in der Mitte, oder nicht?
Nicht face-wink; "Pattern" wird nicht deklariert, sondern erhält als Property des "RegExp"-Objektes eine Wertzuweisung (den Suchstring); verwendet wird dieser Wert dann beim "Execute".
Zum suboptimalen Ergebnis des Scripts:
Versuch es bitte einmal mit den folgenden beiden (von Dir oben als Beispiel geposteten) Zeilen als "ipliste.txt":
0/32 (1) 87.106.84.31:27038 [Launch] deathrun_insane 2972 5460 182 202 612s 160km (99mi) , 89.94% 0
12/16 62.104.179.121:27015 [Launch] surf_ski_2 8029 14917 5 417 33m37s 176km (109mi) Hamburg, 04 95.03% 0
Mit der (eben noch mal runtergeladenen) geposteten Version des Scripts erhalte ich wunschgemäß folgende "ips.txt":
87.106.84.31:27038
62.104.179.121:27015
Um Unicode als Fehlerursache ausschließen zu können, kannst Du einfach mit
type ipliste.txt iplisteASCII.txt
von der Kommandozeile eine ASCII-Version erzeugen und diese als "EinDatei" verwenden.

Zum RegEx
" \d+\.\d+\.\d+\.\d+\:\d+ "
Die Interpretation des Suchbegriffes sollte nicht allzu schwierig sein - aber zur Sicherheit aus der VBS-Onlinehilfe:
\ Markiert das folgende Zeichen als Sonder- oder wortgenaues (literales) Zeichen.
. Entspricht allen Einzelzeichen außer einem Zeilenumbruchzeichen. [Anm.: wird aber jeweils escaped]
+ Entspricht dem vorhergehenden Zeichen ein oder mehrere Male.
\d Entspricht einer Ziffer. Äquivalent zu [0-9].

Zu beachten wären ev die verwendeten Leerzeichen an Anfang und Ende (sollten, da der Batch an dieser Stelle getrennt hatte, aber nicht das Problem sein).

Grüße
bastla
Smiley
Smiley 26.01.2010 um 18:05:51 Uhr
Goto Top
Die Textdateien sind im Windows-Format (Gibts ja auch unter Unix, Mac.) als ANSI kodiert.
Versuch es bitte einmal mit den folgenden beiden (von Dir oben als Beispiel geposteten) Zeilen als "ipliste.txt":
Ja, die gehen; weil dort Leerzeichen anstatt Tabulatoren verwendet sind.
Das " " ist im Forum falsch übernommen worden, nachdem ich das hier reinkopiert habe.
Also, nachdem ich die Leerzeichen im Pattern entfernt habe: "\d+\.\d+\.\d+\.\d+\:\d+", geht es einwandfrei.

Hmpf, Batch ist so einfach! VBS ist da nur ein gaaanz kleines stückchen schwieriger. Naja, wie mit "C" werde ich mich mit VBS wahrscheinlich aus Zeitgründen auch nicht weiter beschäftigen... genau wie mit JS, VB.Net, Pascal ... face-smile

Mit VBS ist eig. in diesem Sinn auch komplizierter: hier werden Variabeln nicht explizit vorher als eine bestimmte Klasse definiert, wie "dim x as integer" in VB.Net oder "int x=3;" in C. Hier kann eine Variable einfach irgendwo stehen, und weil nichts davor steht, wundert man sich manchmal, ob man da nicht einen Fehler gemacht hat und "Set" hätte vor schreiben sollen - vermute ich mal. face-smile

Trotzdem danke. Dieses Forum - und speziell diesen Thread - wird ja noch länger geben und während dessen womöglich Leuten helfen, die ähnliche Probleme mit Batch oder VBS lösen wollen, wie du schon sagtest.

MfG
bastla
bastla 26.01.2010 um 18:39:18 Uhr
Goto Top
Hallo Smiley!

An TAB hatte ich nun tatsächlich (noch) nicht gedacht ... face-sad
Mit VBS ist eig. in diesem Sinn auch komplizierter
Dazu wäre vielleicht anzumerken, dass auch VBS relativ "sauber" geschrieben werden könnte (inkl "Option Explicit" und Deklarationen; letztere allerdings ohne Typ, da generell "Variant" verwendet wird ) - meine Scripts sind allerdings meist etwas "kompakt" face-wink gehalten.

Ob die Nachwelt tatsächlich von diesem Thread profitieren wird, lasse ich mal dahingestellt - anyhow, wenn's Dir (wie auch immer) geholfen hat, ist's ja auch schön ...

Grüße
bastla