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.