145. Auszählen von Zeichen in String mit Batch -absolut neue Methode
Die letzte Abhandlung handelte vom Zugriff auf einen String. Was
liegt da näher, als die länge eines strings mit Bordmitteln zu
bestimmen. Der christliche Autor dieser Webseite bedient sich dazu der
mächtigsten Waffe von Jesus Christus - dem Gleichnis-:)
Dazu nehmen wir die Bundesrepublik auseinander und zerlegen Sie in ihre
Bestandteile - damit ist das Wort gemeint und jenes hat bekanntlich 14
Buchstaben.
Vielleicht erstmal die Batch und für die Profis und danach die
Erklärung für die Laien...
Im zweiten Teil dieser Abhandlung steht übrigens dann
der Quellcode für eine Batch, die ganze Texte ausliest - nach der
folgenden Batch und Erklärung, jetzt aber mal die Grundbatch . eine
reine Batchlösung:
count.bat
set destination=%~dp0%
set /a x=1
Set newstring=
:loop
set hlpstr=0,%x%%%
>"%destination%alpha.bat" ECHO set destination=%%~dp0%%
>>"%destination%alpha.bat" ECHO set str=Bundesrepublik
>>"%destination%alpha.bat" ECHO set str=%%str:"=x%%
>>"%destination%alpha.bat" ECHO set str1=%%str:~%hlpstr%%
>>"%destination%alpha.bat" ECHO Set newstring=%%newstring%%%%str1%%
>>"%destination%alpha.bat" ECHO if "%%newstring%%"=="%%str%%" echo aus ^>aus.txt
>>"%destination%alpha.bat" ECHO exit
start /wait alpha.bat
if exist aus.txt goto ende
set /a x=%x%+1
goto loop
:ende
echo.%x% >auswertung.txt
del aus.txt
del alpha.bat
Ganz ohne enable...expansion..., ist doch irgendwo genial!
Das ganze im Schnelldurchlauf erklärt: Wir bestimmen die Lage der
Batch: set destination=%~dp0%
Wir setzen danach erstmal eine Variable auf 1 (set /a x=1), mit der wir die
Buchstaben zählen. Dann erschaffen wir eine Variable, die erstmal leer
ist Set newstring=.
Danach gehen wir in eine Schleife :loop , in der wir zwei
Sachen machen: Wir fragen den ersten Buchstaben eines Strings ab,
vergleichen ihn mit dem Stringwort Bundesrepublik, stellen fest, dass
ein B nicht die ganze Bundesrepublik ist und
Schreiben das B in
Variable newstring. Beim
nächsten Durchlauf fragen wir BU
ab, die Variable x wird
auf zwei erhöht und beides ist immer noch gleich.
Das Spiel machen wir bis Bundesrepublik gleich 14 ist und dann setzen
wir ein Zeichen, dass die Schleife beendet wird. Die 14 wird in ein
Textdokument geschrieben und die Hilfsdateien zerstört. Das ist das
Grundprinzip: hört sich einfach an, aber wir müssen tricksen...
So, jetzt wird es einfach. Wir schreiben eine Hilfsbatch mit
Namen alpha.bat:
In der ersten Zeile, die nur ein >
Zeichen hat (das ist wichtig, damit bei weiteren Durchläufen alte
Batches überschrieben werden!), wird erstmal die Lage bestimmt:
aus >"%destination%alpha.bat"
ECHO set destination=%%~dp0%% wird in der Batch alpha.bat in Klarschrift:
set destination=%~dp0%
Danach wird der String abgefragt, der als Bundesrepublik
definiert wird: >>"%destination%alpha.bat"
ECHO set str=Bundesrepublik
wird in der Batch zu set str=Bundesrepublik
Der Autor geht davon aus, dass Sie nun wissen, dasss >>"%destination%alpha.bat"
ECHO nur
die Formel zum Schreiben für eine weitere Zeile in die Batch ist und im
folgenden nicht einer weiteren Erklärung bedarf... destination ist der
Pfad zur Batch, den wir zuvor definierten mit set destination=%~dp0%
Weiter im Text:
>>"%destination%alpha.bat" ECHO set str=%%str:"=x%%
Diese Zeile ist dem Umstand geschuldet, dass in der Variable Anführungszeichen auftauchen könnten, wenn Sie z. B. Er sagte:"ich liebe Dich!" als string eingeben. Dann sind da zwei Anführungszeichen und die Batch bleibt stehen.
Also wird ein Anführungszeichen durch ein x erstetzt, wenn es denn in
der Variable vorkommen sollte. Der Batch ist es egal, ob da ein x
oder Anführungszeichen steht - für die Batch würde da eben stehen: Er sagte:xich liebe Dich!x...
Wir Schafffen einen Hilfestring set
hlpstr=0,%x%%%, der die Variable X enthält: %x% , also im ersten Durchlauf
eine 1 beinhaltet. Die zwei
Prozentzeichen sind dem Umstand geschuldet, dass %% von der cmd zu
einem Prozentzeichen expandiert wird. Für die cmd steht da also set hlpstr=0,1%
.
Die nächste Reihe wird ein wenig schwerer und deshalb noch mal
wiederholt: >>"%destination%alpha.bat"
ECHO set str1=%%str:~%hlpstr%%
Wir schreiben also in die Batch die Zeile set str1=%str:~0,1% . Richtig, der Hilfsstring hlpstr. wurde ja vor der
Erstellung der Batch oben definiert und jetzt das Ergebnis in die Batch
geschrieben - einfache Frage der Syntax. Das Prozentzeichen musste
wieder verdoppelt werden, damit ein % in der Alpha,bat steht
(Prozentzeichen werden durch Verdopplung escaped).
Was wurde mit diesem genialen Zug erreicht? In er Hilfsbatch steht nun
der Befehl zur ersten Abfrage des ersten Buchstabens, denn das B aus
Bundesrepublik ist gleich %str:~0,1%
, dass in der Variable str1 gespeichert wird...
>>"%destination%alpha.bat"
ECHO Set newstring=%%newstring%%%%str1%%
Die nächste Zeile sieht als Batchzeile dann ungefähr so aus: Set newstring=%newstring%%str1%
Aha, in dieser Zeile wird dem newstring, der in der Hauptbatch leer
war, um das B beim ersten Durchlauf ergänzt, sobald die Batch gestartet
wird. Zudiesem Zeitpunkt wird die Batch aber erst geschrieben...
>>"%destination%alpha.bat"
ECHO if %%newstring%%==%%str%% echo aus ^>aus.txt
(^ Das Karatzeichen escaped übrigens >)
In der Alpha-Batch steht also als nächste Zeile: if "%newstring%"=="%str%" echo aus
>aus.txt
Jetzt kommt also der Vergleich, wenn also das B gleich Bundesrepublik beim ersten
Durchlauf wäre, dann würde ein Textdokument mit dem Namen aus.txt und als Inhalt aus da
stehen.
Stellen wir uns mal vor, dass bei der Ausführung der Batch irgendwann
mal der 14. Durchlauf mit dem Wort Bundesrepublik (set str1=%str:~0,14%)erreicht würde, also in newstring Bundesrepublik
stehen würde, dann gibt es dieses neue Textdokument, weil
Bundesrepublik (str) eben
gleich Bundesrepublik (newstring)
ist.
Nachtrag: 04.03.2014: Ein Nachtrag: Um mehrere Wörter in einem Satz mit Leerzeichen zu zählen, müssen die Variablen str
und newstring in einem Anführungszeichen stehen. Warum? Weil die
Variable als ganzes adressiert werden muss, die von Chip haben es mit
einer ähnlichen Batch gemacht und es funktioniert... Es reicht aber, wenn man den VGL in Anführungszeichen setzt...
Man kann also durchaus ganze Sätze mit dieser Batch bearbeiten wie die Bundesrepublik ist toll als str Dann sollte der Satz einfach so ohne Anführungsstriche da stehen, also oben set str=Bundesrepublik ist toll! hat 24 Zeichen 22 Buchstaben und zwei Leerzeichen...
Denn irgendwann wollen wir die Schleife ja auch mal verlassen. Das
lassen wir mal so im Raum stehen...
>>"%destination%alpha.bat"
ECHO exit
Die letzte Zeile ist essentiell wichtig, da ansonsten nach jedem
Durchgang gefragt werden würde, ob wir die Batch wirklich weiterlaufen
lassen wollen und das mit einem ja oder nein in der Hauptbatch
quittieren müssten...
start /wait alpha.bat
Szenenwechsel: So, jetzt befinden wir uns wieder in der Hauptbatch und
starten die Nebenbatch - beim ersten Batchdurchlauf ist newstring=B und B ( str) ungleich
Bundesrepublik.
Das wurde bereits erklärt, also setzen wir nun weiter unsere Schleife,
in der wir uns immer noch befinden, fort.
if exist aus.txt goto ende
Aha, wir befinden uns eigentlich in der Ausstiegsformel, denn wenn
dasTextdokument aus.txt vorliegt, dann geht es zum Sprungpunkt :ende,
dass ist aber beim ersten Durchlauf nicht der Fall, also weiter:
set /a x=%x%+1
X wird also in der nächsten Runde um eine Zahl erhöht. Hier kommen wir
aber nur hin, wenn x im Falle des Wortes Bundesrepublik kleiner als 14
ist. Denn wenn x=14, dann würde im newstring Bundesrepublik
stehen und str1
Bundesrepublik sein (set str1=%str:~0,14%).
Also dieser Teil übersprungen werden...
goto loop
Der erste Versuch war ein Fehlschlag, also wird nun Bu ein weiteres mal
abgeprüft mit der Hilfebatch alpha.bat, nur das die Variable x um eins
erhöht wurde (set str1=%str:~0,2%),
newstring=Bu und das ist wieder ungleich
Bundesrepublik), also geht dieses Spiel nun 14 mal!
Jetzt ist newstring=str
also Bundesrepublik gleich Bundesrepublik und nach 13 untauglichen Vergleichen gibt es nun ein valides Gleichnis...und damit geht es
weiter zum Sprungpunkt: :ende
Dann wird x nur noch in ein Auswertungsdokument geschrieben. Das geht
nur in der Hauptbatch, da diese ja x immer fleißig mitzählte, während
die Hilfsbatch alpha.bat ja nur immer konkret die Prüfung mit den
expandierten Variablen durchführte und nicht wissen kann, dass Sie
schon 13 mal erfolglos erstellt wurde...
echo.%x% >auswertung.txt
Da steht also nun die Zahl drin.
Danach wird der aus.txt
und die alpha.bat
gelöscht, die Sie, wenn Sie die Batch nochmals nachvollziehen wollen,
gerne auch erhalten könne, wenn Sie die Löschbefehle
wegnehmen.
Hintergrund: Was ist an dieser Batch denn nun so neu und toll?
Das sehen Profis auf den ersten Blick; Einen String zu vergleichen ist
easy, aber sobald die Zeile set
str1=%str:~0,1% ins Spiel kommt, wird es
kompliziert, weil die rote 1 nicht einfach durch
eine Variable (X) ersetzt werden kann.
Der Autor dieser Seite baut eine Brücke, indem er die Variable %str:~0,1% einfach zerlegt und eine
Hilfsvariable erschafft (hlpstr=0,%x%%%),
die zusammengesetzt in Klarschrift in der Hilfebatch
hineingeschrieben wird (set
str1=%%str:~%hlpstr%%). Je nachdem welcher Wert für x steht, steht da dann in der Hilfbatch
beim 3. Durchlauf z. B. set str1=%str:~3%
Ist mal wieder so eine typische Alternativkonstruktion, wie Sie der
Autor z. B. für die suche nach Duobletten erfand.
Für den Autor dieser Webseite ist das auf der Metaebene nur eine
weitere Abhandlung auf dem Weg zur KI und ein
Merkzettel. Ja, darüber lachen alle, aber hat der Autor nicht
auch eine Dokumenten und
Textverschlüsselung, die jetzt auch wegen der letzten Ereignisse
bald verbessert wird, geschaffen ? - wer zu letzt lacht...
Level 2 Warum ein halbwegs anständiger Zähler schwer zu erstellen
ist anhand einer Batch erklärt, die fast 80 % aus Batch besteht und die
grobsten Hürden überwindet und ein Textdokument konvertiert (beste
Batch zur Zeit im Internet? )
Bereits an der Überschrift erkennen Sie, dass man lieber mit Wordpad,
Open Office oder Office weitaus weniger Probleme hat. Der Autor schrieb
wie gesagt eine Batch, die einen VBS-Anteil hat - ist sonst zu
aufwendig, man verzeihe mir meine Faulheit. Mit dieser Batch
können Sie aus einem Textdokument fließende Texte
auslesen, die Zeilen werden einzeln protokolliert, das Ergebnis
ohne Leerzeichen ausgegeben und die üblichen Zeichen wie !":.,()?§-=
akzeptiert - dann hört es aber schon auf. <> sind tödlich, die
Batch für richtig längere Texte zu langsam und bei Zeilen über 130
Zeichen dürfte es Probleme geben...
erstmal wie immer der Code und dann wird bei der Erklärung auf die Probleme eingegangen:
irgendeinname.bat
set destination=%~dp0%
set /a x=1
set /a b=0
Set newstring=
>"%destination%prtk.txt" ECHO Zeichen in Reihen
copy probe.txt quell.txt
>"%destination%alpha.vbs" ECHO Set objFSO = CreateObject("Scripting.FileSystemObject")
>>"%destination%alpha.vbs" ECHO Set objFile = objFSO.OpenTextFile("%destination%quell.txt", 1)
>>"%destination%alpha.vbs" ECHO strText = objFile.ReadAll
>>"%destination%alpha.vbs" ECHO objFile.Close
>>"%destination%alpha.vbs" ECHO strNewText = Replace(strText, ":", "x")
>>"%destination%alpha.vbs" ECHO Set objFile = objFSO.OpenTextFile("%destination%quell.txt", 2)
>>"%destination%alpha.vbs" ECHO objFile.WriteLine strNewText
>>"%destination%alpha.vbs" ECHO objFile.Close
start /wait alpha.vbs
findstr ^.$ quell.txt >quell1.txt
timeout /t 1
FOR /F "tokens=*" %%A IN ('findstr /N .* "quell1.txt"') DO echo %%A^: >> probe.log
FOR /F "tokens=1,* delims=:" %%i IN (probe.log) DO echo %%j >probe_%%i.log
set /a z=1
:further
for /f "tokens=1,* delims=:" %%a in (probe_%z%.log) do set nwstrg=%%a
:loop
set hlpstr=0,%x%%%
>"%destination%alpha.bat" ECHO set destination=%%~dp0%%
>>"%destination%alpha.bat" ECHO set str=%nwstrg%
>>"%destination%alpha.bat" ECHO set str=%%str:"=x%%
>>"%destination%alpha.bat" ECHO set str=%%str: =%%
>>"%destination%alpha.bat" ECHO set str1=%%str:~%hlpstr%%
>>"%destination%alpha.bat" ECHO Set newstring=%%newstring%%%%str1%%
>>"%destination%alpha.bat" ECHO if "%%newstring%%"=="%%str%%" echo 1 ^>aus.txt
>>"%destination%alpha.bat" ECHO exit
start /wait alpha.bat
if exist aus.txt goto ende
set /a x=%x%+1
goto loop
:ende
set /a b=%b%+%x%
>>"%destination%prtk.txt" ECHO %x%
set /a x=0
del aus.txt
set /a z=%z%+1
if exist *_%z%.log (goto further) else goto final
:final
>>"%destination%prtk.txt" ECHO %b% Zeichen ohne Leerzeichen insgesamt
del alpha.bat
del probe.log
del probe_*.log
del alpha.vbs
del quell.txt
del quell1.txt
Wenn Sie die Batch an irgendeiner Textdatei ausprobieren wollen, dann
empfiehlt sich, den roten Dateinamen einfach entsprechend ihrem
Dateinamen mit der Endung *.txt auszutauschen...
Als probetext nahm der Autor diesen Text:
probe.txt
I think":I
am
legend"
!":.,()?§-=
Das ist eine Textzeile geschrieben in Word, Calibri, mit der Schriftgröße11, also ein normales Dok……
und als Ergebnis kommt bei dieser Konstellation heraus prtk.txt:
Zeichen in Reihen
9
2
7
11
86
115 Zeichen ohne Leerzeichen insgesamt
Dann mal auf zur Erklärung der Batch, die für fortgeschrittene User
gedacht ist, da ein Anfänger an allen Ecken scheitert - ist wirklich
eine komplexe Aufgabe...
Grundprinzip ist wieder der Vergleich eines strins mit einem
string, der Buchstabe für Buchstabe wieder aufgebaut wird und bei
Übereinstimmung mit dem Originalstring die Zahl der
Durchläufe ausgibt.
Das eben Zeile für Zeile. Der Rest sind widrige Probleme mit Syntax und Batches per se...
set destination=%~dp0%
set /a x=1
set /a b=0
Set newstring=
>"%destination%prtk.txt" ECHO Zeichen in Reihen
Zuerst werden Variablen und ein Textdokument erstellt - erstmal nichts
besonders. Die Variable destination beinhaltet den Dateipfad zm
Ordner, wo die Batch liegt.
Der erste Satz der Protokolldatei wird geschrieben - Zeichen in Reihen
copy probe.txt quell.txt
>"%destination%alpha.vbs" ECHO Set objFSO = CreateObject("Scripting.FileSystemObject")
>>"%destination%alpha.vbs" ECHO Set objFile = objFSO.OpenTextFile("%destination%quell.txt", 1)
>>"%destination%alpha.vbs" ECHO strText = objFile.ReadAll
>>"%destination%alpha.vbs" ECHO objFile.Close
>>"%destination%alpha.vbs" ECHO strNewText = Replace(strText, ":", "x")
>>"%destination%alpha.vbs" ECHO Set objFile = objFSO.OpenTextFile("%destination%quell.txt", 2)
>>"%destination%alpha.vbs" ECHO objFile.WriteLine strNewText
>>"%destination%alpha.vbs" ECHO objFile.Close
start /wait alpha.vbs
Der Grundtext wird erstmal kopiert, weil die Kopie im Quelltext
geändert wird. Das Original bleibt hingegen erhalten - dass ist doch
selbstverständlich?
Dann wird ein VBS-Script generiert: >"%destination%alpha.vbs" ECHO ist der Pfad zur Batch mit der oben definierten Variable destination...
Dahinter sind dann die Zeilen vom VBS:
Interessant ist nu, dass ein Doppelpunkt durch ein x
ersetzt wird. Dazu wird das Dokument quell.txt geöffnet, dann
eingelesen und als Variable gespeichert, um dann wieder geschlossen zu
werden. In der Variable werden alle Doppelpunkte durch ein X ersetzt.
Dann wird das Dokument quell.txt geöffnet und der Text mit dem neuen
veränderten Text aus der Variablen überschrieben.
Der Autor verwendete das VBS auch ein wenig mit Absicht, um ihnen zu
zeigen: Sie können in VBS ein ganzes Dokument einlesen und mit zwei
Befehlen mehr schnell die Anzahl eines Textes ermitteln, während
mit der CMD so etwas lange dauert und der Erfolg eher fraglich ist...
Na ja, die Doppelpunkte sind nach dem Start der Batch jedenfalls
ersetzt und nachdem das innerhalb von wenigen Milisikunden erledigt
ist, während die Batch wartet (wait) geht es weiter...ab jetzt nur noch
Batch...
findstr ^.$ quell.txt >quell1.txt
Als erstes werden sämtliche Leerzeilen entfernt. Das geht mit nur einem
Befehl, der ein wenig sich dem Umstand bedient, dass Sätze mit
Leerzeilen keinen Textinhalt haben - der Autor zitiert mal die
Windowshilfe von findstr:
Schnellübersicht regulärer Ausdrücke:
. Platzhalter: beliebiges Zeichen
* Wiederholung: keine oder mehrere Wiederholungen
des/der vorhergehenden Zeichens/Klasse
^ Zeilenposition: Anfang der Zeile
$ Zeilenposition: Ende der Zeile
Also werden alle Zeilen selektiert, die Text beinhalten...
Merke: Leerzeilen sind bei der Batchbearbeitung tödlich, weil der zu
untersuchende Text Zeile für Zeile abgearbeitet wird. Egal, wie Sie
dann weiterarbeiten...
timeout /t 1
FOR /F "tokens=*" %%A IN ('findstr /N .* "quell1.txt"') DO echo %%A^: >> probe.log
FOR /F "tokens=1,* delims=:" %%i IN (probe.log) DO echo %%j >probe_%%i.log
set /a z=1
:further
for /f "tokens=1,* delims=:" %%a in (probe_%z%.log) do set nwstrg=%%a
Der Autor setzt jetzt mal einen Ruhepunkt von einer Sekunde, da ja so ein Doument gröér sein kann...
Dann kommen zwei for-Schleifen - in der ersten werden die Zeilen
nummeriert nach dem Schema: 01:Text und nach ein weiterer Doppelpunkt
eingefügt...
Aus diesem Konstrukt werden die Zeilen in der zweiten for-Schleife in einzelne Textdokumente je einer Zeile zerlegt.
Die Dokumente übernehmen die Zeilennummerierung als probe_1.log...Dabei
werden die Nummern wieder im Text des Dokumentes gelöscht.
Mit der Zeile: for /f "tokens=1,* delims=:" %%a in (probe_%z%.log) do set nwstrg=%%a wird dann eine Zeile als String übergeben.
Die liegt in einer Schleife. Der Sprungpunkt ::further liegt unmittelbar davor. Die Variable Z wird bei jedem Schleifendurchlauf um 1 erhöht und in probe_%z%.log) liegt immer nur eine Zeile vor. Die Variable newstring ist also der Zeileninhalt und wird übergeben.
Der Ausstieg aus der Schleife geschieht am Ende dieser Schleife mit if exist *_%z%.log (goto further) else goto final,
aber das wird dann später erklärt. So viel hierzu: Wenn kein
probe_7.log in unserer Demo vorliegt, also z > 5 ist, dann wird am
Ende der Schleife auf den Ausstiegspunkt final verwiesen...
Zwischenstand: wir haben nun fünf Textdokumente mit jeweils einer Textzeile.
:loop
set hlpstr=0,%x%%%
>"%destination%alpha.bat" ECHO set destination=%%~dp0%%
>>"%destination%alpha.bat" ECHO set str=%nwstrg%
>>"%destination%alpha.bat" ECHO set str=%%str:"=x%%
>>"%destination%alpha.bat" ECHO set str=%%str: =%%
>>"%destination%alpha.bat" ECHO set str1=%%str:~%hlpstr%%
>>"%destination%alpha.bat" ECHO Set newstring=%%newstring%%%%str1%%
>>"%destination%alpha.bat" ECHO if "%%newstring%%"=="%%str%%" echo 1 ^>aus.txt
>>"%destination%alpha.bat" ECHO exit
start /wait alpha.bat
if exist aus.txt goto ende
set /a x=%x%+1
goto loop
:ende
Im ersten Duchlauf (z=1) wird das erste Zeilendokument probe_%z%.log = probe_1.log als String übergeben.
Die nächsten Zeilen wurden bereits im ersten Teil der Abhandlung
erklärt: Eine Batch wird geschrieben, die den ersten Buchstaben
abfragt. Die Variable newstring wird abgefragt, die
Anführungszeichen im Text durch ein X ausgetauscht (set str=%%str:"=x%%) und Leerzeichen (set str=%%str: =%%)
entfernt. Ist der Newstring gleich dem Originalstring, so wird ein
Kontrolltext geschrieben, der die zweite innere Schleife beendet. Das
Ganze passiert in einerBatch. Ist das erledigt (if exist aus.txt goto ende), wird die Schleife für diesen String beendet.
Sonst wird die Variable x um eine Nummer in der inneren Schleife erhöht
set /a b=%b%+%x%
>>"%destination%prtk.txt" ECHO %x%
set /a x=0
del aus.txt
So, Am Ende der Bearbeitung des ersten Strigengs wird X in der
Variablen b gesichert, damit x wieder auf null gesetzt werden kann und
der nächste String gezählt werden kann. >>"%destination%prtk.txt" ECHO %x% , ohne zu vergessen un unserem Protokolltext die Anzahl der bisherigen Zeichen auszudrucken...
set /a z=%z%+1
if exist *_%z%.log (goto further) else goto final
:final
>>"%destination%prtk.txt" ECHO %b% Zeichen ohne Leerzeichen insgesamt
del alpha.bat
del probe.log
del probe_*.log
del alpha.vbs
del quell.txt
del quell1.txt
Dann wird z um eine Zahl höher gesetzt, damit nun das Dokument
probe_2.txt im zweiten Durchlauf bearbeitet werden kann. Erstmal wird
aber gefragt, ob es ein probe_2.txt - Dokument überhaupt noch gibt (if exist *_%z%.log (goto further) else goto final),
ansonsten geht es zum Sprungpunkt :further, wo wieder die for Schleife
aktiv wird und eben das zweite Dokument überprüft, dass wieder
innerhalb der kleinen Schleife den String zerlegt, um Ende wieder
in die große Schleife zu gehen, wo dann das dritte probe_3_txt
überprüft wird...
Das geht dann so bis zum siebenten Dokument, da nach Entfernug der Leerzeilen nur fünf Zeilen ausgewertet werden.
Das ist jetzt alles ein wenig Larifari erklärt, aber wer Zählen will, muss schon ein wenig Ahnung haben.
Aus diesem Grund sind die Angaben im Internet immer sehr
unpräzise, weil egal, welcher Lösungsansatz auch beschritten wird, dass
in For - Befehlen, dann in Schleifen und Sonderbefehlen ausufert.
Der Autor vermied jetzt mal die schweren Befehle und verwendete nur Basisbefehle...
Fazit:
Jedes Kleinkind kann Zeichen zählen, aber für uns erwachsene Batchschreiber ist das eine ausgewachsene Herausforderung.
Der Autor gab am Anfang mit VBS den halben Weg zur Lösung ein: Dort
wird der Text einfach als Variable eingelesen und danach können Sie mit
einer einfachen Schleife ziemlich einfach die Zeichen lesen, aber das
hier ist ja eine Abhandlung über Batch.
Es gibt jede Menge Zeichen, die die Batch stoppen und wenn es nur < > Zeichen sind.
Hey, Sie könnten diese Batch mit set local... und so einen Gedöns
verbessern, aber es bleibt dabei: Batches allein sind suboptimal, um
wirklich richtig gute Ergebnisse zu erzielen und als Admin müssen Sie
die Batches sowieso an Zeichen und Bedürfnisse anpassen.
Hinzu kommt, dass Sie mit einmal copy und paste Zeichen, Leerzeichen, Wöter ...auszählen können.
Mit den zwei hier vorgestellten Batches haben Sie zumindest gute
Anhaltspunkte und die erste gut erklärte Batch reicht für Admins aus -
die wissen, was ich meine und wozu man das gebrauchen kann-:)
In diesem Sinne viel Erfolg für andere Batchschreiber...
Nachtrag 08.02.2014
Hm, im Nachhinein ist vielleicht die Schleifenkonstruktion genial - nur
die Art der Zählung lässt zu wünschen übrig. Wenn Sie die Zerlegung des
Strings in Zeilen durchführen und dann einen Abgleich nach einem
Zeichen am Ende des Satzes machen, das Sie vorher implementierten und
dabei die einzelnen Abfragen wieder in einer anderen Variablen zählen,
dann ließe sich da eine bessere Batch aus der Vorlage konstruieren. Der
Autor ist dazu zu faul. Er braucht das so nicht, aber wer den Ehrgeiz
hat, eine besser Lösung zu finden...