124. Einen Suchindex aus DOC oder DOCX-Dokumenten in Textdokumenten Erstellen

Einleitung

Der Sternenhimmekstuermer erweitert seine Desktopsuchmaschine Merlin und weitet Sie auf die Suche von Docx und Doc - Dokumente aus. Problem: Das Erklären innerhalb des Quellcodes von Merlin wird immer komplizierter.

Da ist es doch mal schön, wenn ein Teil als halbe Standallone-Anwendung läuft. Es geht bei dieser Batch hauptsächlich  um den Weg - nicht um das Ziel!

Das Erstellen von Textdokumenten per Makro ist hingegen easy. Der Sternenhimmelstuermer passte mal den Code für ein Makro an:

Sub conv()
sPath = "C:\cassandra\"
sFile = Dir(sPath & "*.docx")
While sFile <> ""
With Documents.Open(sPath & sFile)
.SaveAs FileName:=sPath & Replace(sFile, "docx", "txt"), FileFormat:=wdFormatText
.Close
End With
sFile = Dir
Wend
End Sub

Die Erklärung für den Code gibt es hier.

Worum es hier geht: Der Sternenhimmelstuermer fing mit einem leeren Editor an, um eine Batch zu erstellen, in der ein VB-Script integriert ist. Die Batch bestimmt ihre Lage..dann eine Liste mit den Docx Dokumenten im selben Verzeichnis und den Unterordnern... erstellt dann einen Unterordner entpackt dort eine andere Batch und ein VB-Script. Das VB-Script liest die Dateiliste aus und erstellt parallel zu sich Textdokumente mit den Inhalt der Docx. Dann werden noch ausführbare Links zu den Originaldateien über dem Text der Dokumente erstellt. Später werden diese HTM-Dokumente im Internet Explorer in Form einer HTA geladen.

Also im Endeffekt werden in der Suchmaschine dann ein Satz des Suchwortes und ein ausführbarer Link im Google-Style zu der Indexseite vorhanden sein. Die Indexseite wird in der HTA geladen und wenn der User es will und es das richtige Dokument ist, dann kann man das Originaldokument laden. Eigentlich ziemlich einfach oder nicht? Suchmaschinen auf HTA-Basis findet man im Internet leider selten...

Inhaltsangabe
Quellcode der Batch
Erklärung Schritt für Schritt


Quellcode der Batch

indexdocx.bat

mkdir "indexdocx"
set destination=%~dp0%
chcp 28591 > NUL
for /f "delims=" %%i in ('dir %destination%*.docx /s /b /a-d') do @echo %%i>>pfadliste.log
for /f "delims=" %%I in (pfadliste.log) do echo %%~sI  >>dos.txt
for /f "delims=" %%i in (dos.txt) do @echo %%~ni^:%%i  >>indexdocx.log
copy indexdocx.log indexdocx\indexdocx.log
del indexdocx.log
del pfadliste.log
del dos.txt
cd indexdocx
FOR /F "tokens=*" %%A IN ('findstr /N .* "indexdocx.log"') DO echo %%A>> indexzahl.log

>"genial.bat" Echo set destination=%%~dp0%%
>>"genial.bat" Echo ^>"wandel%%1.vbs"  ECHO  Set objWord = CreateObject("Word.Application")
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO Set objDoc = objWord.Documents.Open("%%3")
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO objDoc.SaveAs "%%destination%%an_%%1.txt", 2
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO objDoc.Close
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO objWord.Quit
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO Set objDoc = Nothing
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO Set objWord = Nothing
>>"genial.bat" Echo start /wait "" "wandel%%1"
del indexdocx.log
FOR /F "tokens=1,2,3* delims=:"  %%i  IN (indexzahl.log) DO call genial.bat %%i %%j %%k:%%l

del genial.bat

for /F "delims=: tokens=1,2,3*" %%i in (indexzahl.log) do nothing >>an_%%i.log & >>"an_%%i.log" Echo ^<p class=MsoNormal^>^<span lang=EN style='font-weight:normal'^>^<a href="%%k:%%l"^>Text: %%j^</a^>^</span^>^</p^>
set /a ex=1
:weiter
copy an_%ex%.log + an_%ex%.txt fund_%ex%.htm
set /a ex=%ex% + 1
if exist an_%ex%.log (goto weiter) else goto endspurt
:endspurt
del an_*.txt
del an_*.log
del wandel*.vbs



Erklärung Schritt für Schritt


Hier wird mit Absicht nicht bei Adam und Eva angefangen: Wie eine Batch erstellt wird, sollten Sie wissen...

mkdir "indexdocx"

Erstmal wird im selben Verzeichnis relativ zur Batch (im selben Ordner) ein Unterordner mit Namen indexdocx gebildet. In diesem Ordner erbeiten wir später...

set destination=%~dp0%

Wir bestimmen die Lage der Batch:  Nur wenn man weiß, wo man ist, kann man auch sagen, wo man hin will: Ein wesentlicher Bestandteil der künstlichen Intelligenz -:)
Der Pfad der Batch %~dp0% wird in der Variable destination gespeichert.

chcp 28591 > NUL

Wir armen deutschen Batchschreiber sind dazu verflucht, ä,ü,ö usw. vor  der Verwendung eines For-Befehls zu filtern. Dieser Falle entkommen wir, in dem wird uns im nächsten Schritt die DOS-Pfade von den Docx-Dokumenten ziehen...

for /f "delims=" %%i in ('dir %destination%*.docx /s /b /a-d') do @echo %%i>>pfadliste.log

Wir erstellen uns erstmal eine Pfadliste von den docx-Dokumenten, um genau zu sein von den relativen und untergeordneten Verzeichnissen. Es ist also ziemlich egal, wo die Batch liegt. Der For Befehl schreibt erstmal alle Dokumentenpfade dir %destination%*.docx /s /b /a-d in ein Dokument %%i ist also der Pfad der gelisteten DOCX-Dokumente.%destination% ist der Pfad zur Batch. Hier darf kein Slash gesetzt werden, da dieser Bestandteil von %destination% ist. *.doc sind eben auch alle *.docx...

Einschub

Nachtrag 07.08.2012: Es ist besser mit *.doc zu arbeiten, da die Kommandozeile dann *.docx - Dokumente automatisch mit in die Liste aufnimmt. Umgekehrt werden bei docx auch wirklich nur docx-Dokumente gefunden. Bitte diesen Umstand in den folgenden Ausführungen berücksichtigen! Der Sternenhimmelstuermer machte hier auch einen Fehler - irren ist menschlich...

Einschubende


Docx. /s durchsucht die Unterordner.
Dank dem vorherigen chcp gibt es keine Probleme mit ü.ö...Wichtig: Doppelausgabezeichen >> nicht vergessen! Bei  einfachen Zeichen  würde das Ergebnisdokument  pfadliste.log nur die letzte Zeile beinhalten, weil jedes  Dokument mit einem einfachen Ausgabezeichen das alte überschreiben würde (VBS- Schreiber würden sagen, dass ist eine 8 und keine 2).

Tipp vom Sternenhimmelstuermer: kopieren Sie sich den Befehl, kann man immer gebrauchen, wenn man eine Auflistung der Pfadliste braucht...

for /f "delims=" %%I in (pfadliste.log) do echo %%~sI  >>dos.txt

Wir arbeiten nun mit dem Dokument (pfadliste.log) Wir rufen nun jede Zeile diese Dokumentes mit dem For-Befehl auf und geben dafür den Dospfad  %%~sI  aus. Nichts weiter heißt das. Zeile für Zeile wird der DOS-Pfad bestimmt und in ein Dokument namens dos.txt geschrieben. Diese Methode entwickelte der Sternenhimmelstuermer, um mit DOS-Pfaden totsichere Aufrufe von Dateien sicherzustellen. Für Batchschreiber ist dieses ein schwieriges Problem: Zum wiederholten Male: User vergeben gerne Namen von Dokumenten und Ordnern Namen mit Leerzeichen, ü, ä,... Das ist für Batchschreiber tödlich, die noch mit 5 + 3 arbeiten...

for /f "delims=" %%i in (dos.txt) do @echo %%~ni^:%%i  >>indexdocx.log

Den (dos.txt) wandeln wir jetzt in ein Logdokument indexdocx.log. Das beinhaltet jetzt den Namen der Datei %%i und den Dos-Pfad %%~ni des des Dokumentes. So gesehen erweitern wir eine einreihige Tabelle in eine zweireihige mit einer Zusatzinformation.

Als Separator (Trennzeichen) wird ein Doppelpunkt gesetzt. Damit der For Befehl den Doppelpunkt als Schriftzeichen interpretiert, wird dieser mit diesem komischen Zeichen "escaped" ^: , so das am Ende diese Konstruktion entsteht: %%~ni^:%%i

Das sieht für einen Anfänger erstmal schwer aus, aber ist wirklich easy zu begreifen, wenn man es vom Sternenhimmelstuermer mal einfachst erklärt bekommt...

copy indexdocx.log indexdocx\indexdocx.log

Dieses Dokument indexdocx.log war das erste Teilziel, dass jetzt in den Unterordner kopiert wird indexdocx\indexdocx.log.

Die Batch arbeitet immer noch eine Etage über dem Ordner indexdocx.  Das werden wir gleich ändern, aber löschen nun erstmal die ganzen Hilfsdokumente:

del indexdocx.log
del pfadliste.log
del dos.txt

Ja, auch die Original indexdocx.log  wird gelöscht, da eine Kopie im Unterordner liegt. Der Löschbefehl kann in dieser Art nur Dokumente im selben Ordner löschen.

cd indexdocx

Jetzt wechseln cd wir eine Etage tiefer in den Ordner indexdocx . Es ist relativ leicht in einen Unterordner zu wechseln, aber z. B. zurück zu kommen, geht nur sauber, wenn Sie die Lage vorher bestimmt haben und irgendwo nierdergeschrieben oder als Variable gespeichert haben - wie z. B. unser %destination% (bei Batch immer zwei Prozentzeichen; mit cd %destination% könnten Sie dann wieder zurück, was wir in dieser Batch nicht brauchen - nur so eine Anmerkung...).


Wie dem auch sei - wir befinden uns mit der Batchbearbeitung im Unterordner, welches nur den Vorteil besitzt, dass wir mit relativen Bezügen weiterarbeiten können, was eben kürzer und einfacher als mit absoluten Pfaden ist.

FOR /F "tokens=*" %%A IN ('findstr /N .* "indexdocx.log"') DO echo %%A>> indexzahl.log

Diesen Befehl hätten wir auch früher anwenden können, aber vier For Befehle hintereinander ist gerade für Anfänger heavy. Der For-Befehl setzt vor jeder ('findstr /N .* "indexdocx.log"') Zeile %%A eine Nummer mit Doppelpunkt als Separator - das ist auch ein wenig der Grund, warum der Sternenhimmelstuermer Doppelpunkte als Separator verwendet.

Eine Zeile mit einem Docx sieht zu diesem Zeitpunkt dann im neuen Dokument indexzahl.log  z. B. so aus: 5:LERNVE~1:C:\probe\vers\LERNVE~1.DOC

Ist die fünfte 5 Zeile mit dem Namen LERNVE~1 und des Pfades C:\probe\vers\LERNVE~1.DOC  des DOCX auf Dosebene. Noch Fragen, warum es manchmal mit normalen Pfaden Schwierigkeiten gibt? Übrigens überlebt das Dokument indexzahl.log die Löscharien, so dass Sie es sich ruhig einmal anschauen können...

Ja, es gibt noch eine Schwierigkeit: Zwischen dem Laufwerkbuchstaben - in Beispiel C - und dem Rest des Pfades ist ein Doppelpunkt. Darum kümmern wir uns später..., Erstmal ein Themenwechsel: Wir haben eine Liste, die wir nun abarbeiten:

 >"genial.bat" Echo set destination=%%~dp0%%
>>"genial.bat" Echo ^>"wandel%%1.vbs"  ECHO  Set objWord = CreateObject("Word.Application")
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO Set objDoc = objWord.Documents.Open("%%3")
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO objDoc.SaveAs "%%destination%%an_%%1.txt", 2
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO objDoc.Close
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO objWord.Quit
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO Set objDoc = Nothing
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO Set objWord = Nothing
>>"genial.bat" Echo start /wait "" "wandel%%1"

Wir kreieren nun eine Batch, die ein VBS erstellt und dieses startet. Das erscheint erstmal ein wenig abstrus: Vielleicht ein kurzer Sprung, um den Grundgedanken nachvollziehen zu können: Wir wollen sämtliche Zeilen unser erstellten Batch nun gebrauchen, um aus jedem DOC/DOCX- Dokument ein Textdokument zu erstellen. Spezialist für Stapelverarbeitungen ist bekanntlich ein For-Befehl in der Batchwelt.

Der kommt aber bekanntlich nicht an den Inhalt von Docx-Dokumenten. Also rufen wir mit der Ursprungsbatch mit einem For Befehl

FOR /F "tokens=1,2,3* delims=:"  %%i  IN (indexzahl.log) DO call genial.bat %%i %%j %%k:%%l

für jede Zeile die neu erstellte Batch genial.bat auf. Diese bekommt Variablen %%i %%j %%k:%%l übergeben und erstellt für jeden Pfad ein VBS (Visual Basic Script). Die ursprünglich übergebenen Variablen  %%i %%j %%k:%%l heißen nach der Übergabe call an die genial.bat %%1 %%2 %%3

Die genial.bat schreibt also ein wandel%%1.vbs, wobei %%1 unsere Zeilennummer ist. Dann startet Sie das VBS und wartet auf die Erledigung der Aufgabe, also der Erstellung des Textdokumentes an_%%1, dass im Pfad im Unterordner %destination% liegt. Die Variable destination wurde nochmal zwischenzweitlich neu definiert...

Warum denn nun die zweite Batch? Es ist unmöglich oder sagen wir mal dem Sternenhimmelstuermer nicht anders möglich, die Werte des LOG-Textes zu übergeben und dann ein neues VBS mit einem For-Befehl zu kreieren. Klar, man hätte auch ein Textdokument mit Platzhaltern kreieren können, um dass dann immer wieder zu benutzen oder ein paar Zeilen VBS benutzen können, um die Aufgabe zu erledigen - aber so funktioniert das doch gut...

Wer das nicht verstanden hat, der begleitet jetz die weiteren Ausführungen.

  >"genial.bat" Echo ist die erste Zeile mit nur einem Ausgabezeichen.
Der Name und die erste Zeile der neuen Batch werden festgelegt. Das hinter ECHO ist der Inalt  set destination=%%~dp0%% der neu erstellten Batch.
Ist mal wieder eine Ortsbestimmung. Der Name  der Ortsbestimmung ist eigentlich unglücklich, da der Wert der alten Variable destination überschrieben wird. Wollte der Sternenhimmelstuermer wieder aus dem Ordner heraus in die übergeordnete Ebene, dann hätte er die Variable eben Ort genannt.

Hier muss wieder escaped werden, damit die Prozentzeichen in die neue Batch übergeben werden, werden die Prozentzeichen verdoppelt!

>>"genial.bat" Echo

Die zweite Zeile mit zwei Ausgabezeichen, damit die erste Zeile nicht überschrieben wird. ^>"wandel%%1.vbs"  ECHO  Set objWord = CreateObject("Word.Application")

Die genial.bat soll nach Ausführung ein VBS erstellen. Nach dem ECHO kommt also der Code zur Erstellung der wandel%%1.vbs . Das Ausgabezeichen am Anfang wird mit einem Karatzeichen escaped ^>.

wandel%%1.vbs Später werden der genial.bat drei Variablen übergeben:

%%1 entspricht der Zeilennummer
%%2 entspricht -oh, mir fällt gerade so auf, brauchen wir gar nicht - schöne Übung - Ist der Dateiname -:)
%%3 entspricht - dem Pfad

Jede Zeile die von der indexdocx.bat mit einem For-Befehl übergeben wird, hat einen unterschiedlichen Namen.

>>"genial.bat" Echo ^>"wandel%%1.vbs"  ECHO  Set objWord = CreateObject("Word.Application")
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO Set objDoc = objWord.Documents.Open("%%3")
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO objDoc.SaveAs "%%destination%%an_%%1.txt", 2
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO objDoc.Close
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO objWord.Quit
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO Set objDoc = Nothing
>>"genial.bat" Echo ^>^>"wandel%%1.vbs" ECHO Set objWord = Nothing

Ab Zeile zwei müsste jetzt alles klar sein. Die Batch, die ein VBS erstellt, wird zuende geschrieben, mit dem Text für das VBS, welche später von der genial.bat erstellt wird.

>>"genial.bat" Echo start /wait "" "wandel%%1"

Die letzte Zeile ist wahnsinnig wichtig. Die Batch genial.bat erstellt das VBS bei Ausführung durch einen For-Befehl in der Hauptanwendung nicht nur, sondern startet das VBS-Script wandel%%1.

Der Parameter  /wait lässt dabei die Batch so lange warten, bis das VBS seine Arbeit erledigt hat. Indirekt wartet auch die Hauptanwendung und damit der For-Befehl, der später die Batch mit einem Call Befehl startet.

Warum? Erst nachdem die genial.bat geschlossen wurde, wird auch die nächste Zeile im For-Befehl verarbeitet. Sie müssen ein wenig über zwei Ecken denken, aber brauchen später dafür keine Angst zu haben, dass die Ursprungsbatch insgesamt weiter arbeitet und dann die ganze Batch unbrauchbar wird...

Das VBS öffnet ein Docx aus der Liste und speichert es als Textdokument. Es verwendet dazu ihr installiertes Officeprogramm - ohne das geht es nicht.

 del indexdocx.log

Nachdem  das indexdocx.log zerstört wurde, wir haben ja das indexzahl.log für den For-Befehl, wird nun die Liste abgearbeitet.

FOR /F "tokens=1,2,3* delims=:"  %%i  IN (indexzahl.log) DO call genial.bat %%i %%j %%k:%%l

Wir haben also ein  indexzahl.log Dokument mit drei und mehr Spalten (tokens=1,2,3*) mit Doppelpunkten (delims=: ) als Separator.

Zur Erinnerung und Visualisierung noch Mal die Beispielszeile: 5:LERNVE~1:C:\probe\vers\LERNVE~1.DOC
%%i ist die Zeilennummer 5
%%j ist der Name des Docx LERNVE~1
%%k ist der Laufwerksbuchstabe C
%%l ist der Rest des Pfades nach dem Doppelpunkt \probe\vers\LERNVE~1.DOC

Für jede Zeile wird erstmal die Zeilennummer aufgerufen, um (DO) die vorher erstellte Batch call genial.bat zu starten, der die Variablen %%i %%j %%k:%%l
übergeben werden. Nein, Sie brauchen keine Anführungszeichen.

Die gestartete genial.bat kann mit %%i %%j %%k:%%l  (den Variablennamen des For-Befehls) nichts anfangen. Wohl aber mit den Klartextwerten der Zeile, die nun als %1 %2% und %3 abrufbar sind.

Das ist die Konvention zur Übergabe beliebiger Werte zwischen Programmen...Ein Leerzeichen ist nun ein natürlicher Separator.

Deshalb entspricht %%k:%%l einfach %3. Richtig, der Doppelpunkt wurde nicht escaped. Ein Doppelpunkt scheint die schöne Eigenschaft zu haben zwei Variablen zu einer zu verbinden-zumindest in einem For-Befehl - ist jetzt nur so eine Vermutung des Sternenhimmelstuermers - der ist pragmatischer Autodidakt und weiß nicht den theoretischen Überbau -:)

Der Befehl startet call also die genial.bat, die zuvor erstellt wurde und übergibt die Werte aus der Logdatei %%i %%j %%k:%%l , die als %1 %2% und %3 übergeben werden. Dann erstellt die Batch ein individuelles VBS (durch Zeilennummer) und startet das VBS. Die Batch genial.bat wartet dann auf die Ausführung (start /waite). Danach schließt sich die Genial.bat. Erst jetzt wird das nächste %%i verwendet (die nächste Zeile im Log-Dokument indexzahl.log). Dasselbe Spiel wiederholt sich für jede Zeile - eben das, was man Stapelverarbeitung nennt...

 del genial.bat
Danach geht es weiter mit der Zerstörung der genial.bat, die nicht mehr gebraucht wird.

for /F "delims=: tokens=1,2,3*" %%i in (indexzahl.log) do nothing >>an_%%i.log & >>"an_%%i.log" Echo ^<p class=MsoNormal^>^<span lang=EN style='font-weight:normal'^>^<a href="%%k:%%l"^>Text: %%j^</a^>^</span^>^</p^>

Der For-Befehl ist lang, aber easy. Wir bemühen wieder unser  indexzahl.log und tun dafür nichts do nothing, was mit dutzenden von Meldungen im Hintergrund belohnt wird, da der Befehl nothing ein Kunstwort ist. Los geht es erst danach: Hinter den zwei Ausgabezeichen wird ein Logdokument erstellt an_%%i.log ,welches mit mehreren Zeilen Text für jede Zeile unseres indexzahl.log durchgeführt wird.

& >>"an_%%i.log" Echo ist der Einleitungstext für jede neue Zeile im neu erstellten Log-Dokument & >>"an_%%i.log" Echo Erinnern Sie sich an die Erstellung der genial.bat. Richtig: abssolut dasselbe Schema - nur ist der Platz auf 256 Zeichen (?) beschränkt.

Dahinter muss wieder escaped werden. Die Zeile im HTML-Code generiert einen ausführbaren Link im Internetexplorer. Den Rest braucht der Sternenhimmelstuermer nicht zu erklären, da das alles ziemlich dasselbe ist...

set /a ex=1
:weiter
copy an_%ex%.log + an_%ex%.txt fund_%ex%.htm
set /a ex=%ex% + 1
if exist an_%ex%.log (goto weiter) else goto endspurt
:endspurt

Die Zeilen müssen einfach zusammen erklärt werden, da die zu einer Schleife gehören.

Ziel ist jetzt jedem Logdokument  an_%ex%.log ein entsprechendes an_%ex%.txt zuzuordnen und in einem HTML-Dokument zusammenzufügen fund_%ex%.htm.

Sie verstehen nur Bahnhof?

Wir haben zuvor Textdokumente mit dem Inhalt von den DOCX- Dokumenten aus einer selbst erstellten Liste indexzahl.log erstellt.

Aus derselben Liste haben wir Log-Dateien kreiert, die einen ausführbaren Link zum Dokument beinhalten.

Die zusammengehörenden Textdokumente und Log-Dateien haben nun "rein zufällig" dieselben Zeilennummern in der Überschrift.

Ein Beispiel: Das erste Textdokument heißt an_1.txt. In diesem ist der Inhalt des Docx-Dokumentes. Im letzten For Befehl würde der zugehörige Link-Befehl dazu im Logdokument an_1.log liegen. Führen wir die beiden Dokumente mit einem copy-Befehl zusammen, dann steht in der ersten Zeile der Link und darunter der Text des Textdokumentes bzw. des ursprünglichen docx.

Wir wissen, dass es gleich viele Log und Textdokumente gibt, so dass wir natürlich auch ein For-Befehl verwenden könnten, aber ein copy Befehl in einer Schleife erledigt die Aufgabe genausogut...

Also setzen wir mit set /a ex=1 die Variable ex auf 1. set /a ist für die Deklarierung von 1 als Zahl notwendig. Ungeschriebene Regel ist es eigentlich, nur einen Buchstaben (z. B. x) als Variable zu benutzen.

Es geht aber auch mit mehr Buchstaben - halten wir Pragmatiker uns an Konventionen?

:weiter ist nur eine Sprungmarke für den goto Befehl. Dahin kommen wir noch....copy an_%ex%.log + an_%ex%.txt fund_%ex%.htm ist der Code für das Kopieren zweier Dokumente in ein neues.

ex= ist im ersten Durchlauf als 1 definiert. Also werden diese beiden Dokumente zusammengeführt.set /a ex=%ex% + 1 : Die Variable wird nun wieder um eine eins erhöht (nicht vergessen set /a für eine Zahlenvariable zu verwenden). Also ist ex beim ersten Durchlauf nun 2.

if exist an_%ex%.log (goto weiter) else goto endspurt Keine Schleife ohne Ausstiegsklausel! Die läuft folgendermaßen ab: Es wird geprüft, ob ein Log-Dokument mit der nun um eine Zahl erhöhten 2 (in unserem Beispiel) vorliegt if exist an_%ex%.log .

Wurde ein zweites Dokument konvertiert, dann steht es auch in der erstellten Liste indexzahl.log und es existiert ein an_2.log (natürlich hätte man die Prüfung auch anhand von an_2.txt machen können -:)).

In diesem Augenblick geht die Batchbearbeitung wieder zum Sprungpunkt :weiter . Existiert hingegen kein höheres Dokument geht es zum anderen Sprungpunkt else goto endspurt und verlässt die Schleife.

Dann noch ein paar Aufräumarbeiten:


del an_*.txt
del an_*.log
del wandel*.vbs

Die ganzen Hilfsdokumente und VBS's werden entmüllt. Übrigens deckt die Wildcard auch Nummern wie z. B. 11 ab. Das ist wichtig zu wissen, denn wir wissen ja erstmal nicht, wieviel Docx so in den Unterordnern schlummern und sonst wäre bei der Zahl 9 eben Ende.

Fazit

Der Weg ist das Ziel gilt insbesondere für diese Abhandlung. "Rein zufällig" beinhaltet diese Batch sämtliche For-Befehle und filigranen Tricks, ohne die Anfänger kläglich scheitern. Deshalb wurde diese Abhandlung nochmal als Zusammenfassung der letzten ungefähr 20 Abhandlungen ein letztes Mal so ausführlich erklärt.

Als nächstes wird die Suchmaschine Merlin ergänzt, verbessert und abgeschlossen.




Impressum
Datenschutz