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.
 



Impressum
Datenschutz