112. Folgeabhandlung 111: Eine ausführbare Dateiliste im HTML-Format
Einleitung
Eine Dateiliste mit einem einfachen Dir-Befehl aufstellen kann jeder
Batchanfänger, aber daraus eine ausführbare Dateiliste im HTML zu
erstellen gehört schon in den Amateurbereich. Wie dem auch sei, der
Sternenhimmelstuermer erklärte in der letzten Abhandlung, wie man
Offline Links von einem HTML-Dokument auf ausführbare Dateien setzt.
Das gilt natürlich für sämtliche Dateien mit Endungen, die in Windows
mit einem zugehörigen Programm zum Öffnen (Standardanwendung)
registriert sind.
Das geht natürlich nur mit dem Internet Explorer! Darüber dürfte
sich die Microsoft Corporation freuen - insbesondere da die
nächste Abhandlung auch auf diesem Prinzip beruht...
Die folgende Batch ist wieder eine voll lauffähige Demo zur Erstellung
einer ausführbaren Dateiliste. Die Knackpunkte werden wieder
erklärt. Der
Html-Link wurde bereits ausführlich erläutert.
Batch
Quellcode beliebigername.bat
set /p Dateiendung= Geben Sie
die Dateiendung an!
set destination=%~dp0%
chcp 28591 > NUL
for /f "delims=" %%i in ('dir
"%destination%*.%Dateiendung%" /s /b /a-d') do @echo %%~zi^:%%~ni^:%%i
>>gro.log
>"%destination%neu.htm" ECHO
^<html^>
>>"%destination%neu.htm"
ECHO ^<head^>
>>"%destination%neu.htm"
ECHO ^<style type="text/css"^>
>>"%destination%neu.htm"
ECHO a {color:#FFFF33; font-size:10pt;
font-family:verdana,sans-serif,tahoma; text-decoration:none}
>>"%destination%neu.htm"
ECHO a:hover {color:#FF0000; font-size:10pt;
font-family:verdana,sans-serif,tahoma; text-decoration:none}
>>"%destination%neu.htm"
ECHO a.menu1 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma;
font-size:8pt; text-decoration:none}
>>"%destination%neu.htm"
ECHO a.menu1:hover {color:#FF0000;
font-family:verdana,sans-serif,tahoma; font-size:8pt;
text-decoration:none}
>>"%destination%neu.htm"
ECHO a.menu2 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma;
font-size:9pt; text-decoration:none}
>>"%destination%neu.htm"
ECHO a.menu2:hover {color:#FF0000;
font-family:verdana,sans-serif,tahoma; font-size:9pt;
text-decoration:none}
>>"%destination%neu.htm"
ECHO ^</style^>
>>"%destination%neu.htm"
ECHO ^</head^>
>>"%destination%neu.htm"
ECHO ^<body style="color: white; background-color: black;"
alink="red"
>>"%destination%neu.htm"
ECHO link="yellow" vlink="#3333ff"^>
chcp 28591 > NUL
for /F "delims=: tokens=1,2,3*"
%%i in (gro.log) do nothing >>neu_%%i.log &
>>"neu_%%i.log" Echo ^<p class=MsoNormal^>^<span lang=DE
style='font-weight:normal'^>^<a href="%%k:%%l"^>Dateiname %%j
Größe %%i^</a^>^</span^>^</p^>
copy neu_*.log erg.log
copy neu.htm + erg.log ergebnis.htm
del *.log
del neu.htm
>>"%destination%ergebnis.htm"
ECHO ^</body^>
>>"%destination%ergebnis.htm"
ECHO ^</html^>
Der Sternenhimmelstuermer perfektionierte teilweise seinen üblichen
Code und bringt ein paar Varianten. Von daher hat es dieser Code in
sich, da ziemlich perfekt...
Erklärung
set /p Dateiendung= Geben Sie
die Dateiendung an!
Erstmal wird eine Eingabe erwartet - nämlich die Dateiendung ohne
Punkt: PDF, MP3, docx oder Wildcard * - nichts neues. Die Variable
der
Eingabe heißt Dateiendung..
set destination=%~dp0%
Hier wird wieder eine Variable gesetzt - nämlich der Pfad zur Batch %~dp0% ist schon seit Urzeiten
(letztes Jahrhundert) bekannt in der Dos-Welt.
Warum wird der Befehl hier verwendet und kein relativer Pfad? Das macht
die Batch flexibler. Egal in welchem Ordner oder Verzeichnis die Batch
liegt - Sie kann immer den Pfad als
Variable mit Namen destination (der Name tut nichts zur Sache...)
verwendet werden. Später brauchen wir absolute Pfade, damit wir
fehlerfrei ein HTM-Dokument erstellen können.
chcp 28591 > NUL
Für uns Deutsche ist diese Zeile vor jedem For-Befehl mit Dateinamen
Pflicht. Mal ehrlich, haben Sie auch nicht aus DOS-Sicht die Dummheit
begangen ein ü,ö oder ä im Dateinamen zu verwenden?
Das ist für Batches tödlich, es sei denn, Sie planen das ein und
definieren die Übernahme mit diesem Befehl.
for /f "delims=" %%i in ('dir
"%destination%*.%Dateiendung%" /s /b /a-d') do @echo %%~zi^:%%~ni^:%%i
>>gro.log
Einer der Lieblingsbefehle vom Sternenhimmelstuermer mit einer wirklich
gelungenen Innovation -
Dadurch, dass "%destination%*.%Dateiendung%"
mit
Anführungsstrichen versehen wurde, sind nun auch lästige Doppelnamen in
Pfaden kein Problem. Also, im Dosbereich ticken die Uhren anders.
Bei einem Dir-Befehl, der in einem For-Befehl integriert ist, wird eine
Dos-kompatible Eingabe im Einstieg erwartet. Ist dann in unserem Fall
die Variable destination (=%~dp0%)
ein Pfad wie C:\Wohnungsordner
privat , dann wird das zu C:\Wohnun~1 auf Dosebene - böse Falle, da nun
die Batch beendet wird und die Fehlermeldung: Pfad nicht gefunden!
Vielleicht noch für
den Bruchteil einer Sekunde bei normaler Einstellung angezeigt wird. So
ist jetzt der Befehl hingegen perfekt! Nur noch nicht so im Internet
gesehen. Wie gesagt: läuft der Einstieg klappt alles danach,
aber ein User, der das nicht weiß, einen Doppelnamen mit Leerzeichen
als Benutzername vergeben hat und die Batch auf dem Desktop startet,
denkt, dass die Batch nicht funktioniert!
Der Sternenhimmelstuermer macht auf diese Falle immer wieder
aufmerksam, aber im Internet verhalten sich die Batchschreiber
weitestgehend stur...
Ach ja, der Befehl erstellt insgesamt eine Dateiliste im Pfad, wo die
Batch liegt, mit dem Dateienpfad zur Batch und deren Unterverzeichissen
mit der zuvor eingegebenen Dateiendung.
Die drei Ausgabeoptionen (%%~zi^:%%~ni^:%%i)
entsprechen Dateigröße, Dateiname und Dateipfad. Separator ist
ein Doppelpunkt, der mit ^
escaped wird. Der Doppelpunkt wird also als
Schriftzeichen vom For-Befehl interpretiert und ausgedruckt.
>"%destination%neu.htm" ECHO
^<html^>
>>"%destination%neu.htm"
ECHO ^<head^>
>>"%destination%neu.htm"
ECHO ^<style type="text/css"^>
>>"%destination%neu.htm"
ECHO a {color:#FFFF33; font-size:10pt;
font-family:verdana,sans-serif,tahoma; text-decoration:none}
>>"%destination%neu.htm"
ECHO a:hover {color:#FF0000; font-size:10pt;
font-family:verdana,sans-serif,tahoma; text-decoration:none}
>>"%destination%neu.htm"
ECHO a.menu1 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma;
font-size:8pt; text-decoration:none}
>>"%destination%neu.htm"
ECHO a.menu1:hover {color:#FF0000;
font-family:verdana,sans-serif,tahoma; font-size:8pt;
text-decoration:none}
>>"%destination%neu.htm"
ECHO a.menu2 {color:#FFFFFF; font-family:verdana,sans-serif,tahoma;
font-size:9pt; text-decoration:none}
>>"%destination%neu.htm"
ECHO a.menu2:hover {color:#FF0000;
font-family:verdana,sans-serif,tahoma; font-size:9pt;
text-decoration:none}
>>"%destination%neu.htm"
ECHO ^</style^>
>>"%destination%neu.htm"
ECHO ^</head^>
>>"%destination%neu.htm"
ECHO ^<body style="color: white; background-color: black;"
alink="red"
>>"%destination%neu.htm"
ECHO link="yellow" vlink="#3333ff"^>
Hier wir nur die erste Hälfte des HTML-Dokumentes erstellt. Als
Besonderheit müssen sämtliche Ausgabe > bzw. Eingabe < zeichen wieder escaped ^ werden.
Das ist die einzige Besonderheit, die in HTML-Dokumenten einen
erheblichen Aufwand darstellt. Der <Head> is <Body> Bereich
ist jetzt fertig im Übergangsdokument neu.htm relativ zur Batch.
chcp 28591 > NUL
for /F "delims=: tokens=1,2,3*"
%%i in (gro.log) do nothing >>neu_%%i.log &
>>"neu_%%i.log" Echo ^<p class=MsoNormal^>^<span lang=DE
style='font-weight:normal'^>^<a href="%%k:%%l"^>Dateiname %%j
Größe %%i^</a^>^</span^>^</p^>
Jetzt wird es wieder tricky: Die Zeilen mit dem Link (^<p class=MsoNormal^>^<span
lang=DE
style='font-weight:normal'^>^<a href="%%k:%%l"^>Dateiname %%j
Größe %%i^</a^>^</span^>^</p^>)
(ist eine Zeile) wiederholen sich ständig, also missbrauchen wir einen
For-Befehl und erstellen aus unserer zuvor erstellten Dateiliste lauter
kleine Log-dateien mit einer Zeile Inhalt - Geht leider nicht anders,
da wir %%i brauchen - was nun mal die Dateigröße ist. Haben zwei
Dateien dieselbe Dateigröße - z. B. 4563 Bytes, dann macht das nichts,
da der For-Befehl mit zwei Ausgabezeichen >> arbeitet und dann
nicht destruktiv eben eine zweite Zeile in das neu_%%i.log
schreibt.
Es entstehen also eine unbestimmte Zahl an neu_%%i.log Dokumente.
Das do nothing ist eine
Spielerei. Wir wollen nichts mit %%i
machen -
bloß nicht auf die Idee kommen echo
dorthin zu schreiben - Dann werden
die folgenden Zeilen ignoriert...
Tja, da wir drei Variablen hatten, werden die nun in den Link
integriert. Hinter den Ausgabezeichen wird das neue Dokument >>"neu_%%i.log" angelegt,
wird mit &
>>"neu_%%i.log" Echo die Ausgabe der ersten Zeile im neuen
Dokument eingeläutet.
Weitere Zeilen wären übrigens möglich, aber immer daran denken, dass
diese Zeile quasi die Umschalttaste in eine neu Zeile ist.
Beim Link ^<a
href="%%k:%%l"^>
gibt es noch eine kleine Besonderheit: Der Doppelpunkt war ein
Separator und C:\ beinhaltet einen Doppelpunkt im Pfad. Da der
Sternenhimmelstuermer das weiß, setzt er die zwei Bestandteile (Tokens) einfach wieder
zusammen.
copy neu_*.log erg.log
copy neu.htm + erg.log ergebnis.htm
del *.log
del neu.htm
Das ist jetzt easy. Den Inhalt der ganzen kleinen neu_%%i.log Dokumente aus dem
For-Befehl werden in einem erg.log
zusammengefasst. Die Zeilen werden ja untereinander ins neue Dokument
geschrieben.
In der nächsten Zeile ergänzen wird neu.htm mit dem erg.log und
fassen das in einem ergebnis.htm zusammen. Ja, dass ginge auch
verkürzt, aber der Sternenhimmelstuermer bevorzugt nachvollziehbare und
sichere Strukturen.
Danach werden erstmal alle Log-Dateien zerstört. Natürlich nur alles
relativ zur Batch...
Dann wird explizit das Hilfsdokument neu.htm zerstört - das Ergebnis
haben wir bereits ins ergebnis.htm
kopiert.
>>"%destination%ergebnis.htm" ECHO
^</body^>
>>"%destination%ergebnis.htm"
ECHO ^</html^>
Wir vervollständigen das Ergebnis-htm mit dem Ende des Html-Codes. Ach,
übrigens vergessen Sie nie, dass Sie immer zwei Ausgabezeichen >>
verwenden, da ein Ausgabezeichen destruktiv wirkt - Die Datei wird
überschrieben...
Wenn Sie ein wenig nachvollziehen wolen, wie die Batch arbeitet, dann
nehmen Sie die del -
Befehle weg. Dann noch , wo sie
Schwierigkeiten haben, den Befehl pause
in eine Zeile einfügen. Die CMD
bleibt geöffnet stehen und wartet auf das Betätigen der Entertaste -
zeigt aber gleichzeitig an, was bisher so passierte...
Fazit
Das sollte eigentlich eine Abhandlung werden, aber der
Sternenhimmelstuermer streckt das jetzt auf drei Abhandlungen. So eine
ausführbare Dateiliste ist eine tolle Sache.
Wer sich die Mühe macht, die Erklärungen durchzulesen, kann von dieser
Abhandlung eine Menge lernen: Wie man den Standort einer Batch
ermittelt, ein Html-Dokument Schritt für Schritt unter Einbindung
einer For-Schleife erstellt und...also eine gute Lernanleitung.