polofahrer
Goto Top

Skript erstellen das Dateinamen ausliest und als Link in HTML-Datei einfügt

Ich möchte für eine FotoCD die Dateinamen von Bildern aus einem Verzeichnis auslesen und als link in eine vorgefertigte HTML-Datei einfügen (dabei wird ein platzhalter überschrieben).

Hallo Zusammen!
Ich habe jetzt einige zeit nach einer Lösung für mein Problem gegoogelt. Ich konnte zwar herausfinden, wie man dateinamen ausliest, jedoch nicht, wie man sie formatiert in eine Datei schreiben kann. Zum Ablauf meines kleinen Skripts:

1) Dateinamen im Verzeichnis auslesen,
z. B. mit "for /f "tokens=1,2,4" %%i in ('dir *.txt^|find /i ".txt"')" ich weiß jedoch nicht, wie man das in eine vorgefertigte Datei schreibt...

2) Die Datei "index.html" soll im
<body>
eine Liste mit den links und den Thumbnails der anzuzeigenden Bilder enthalten:
 

<a href="./600x800/Dateiname1.jpg" rel="lightbox[GV]; target="   
style="text-decoration: none;"><img src="./Thumbnails/Dateiname1.jpg"   
alt="Dateiname1.jpg" border="0" height="150" width="150" />  

<a href="./600x800/Dateiname2.jpg" rel="lightbox[GV]; target="  
 style="text-decoration: none;"><img src="./Thumbnails/Dateiname2.jpg"   
alt="Dateiname2.jpg" border="0" height="150" width="150" />   

und so weiter
Dazu habe ich vorher zwei Verzeichnisse mit den jeweils gleichnamigen Bildern erstellt: Ordner "600x400" mit den anzuzeigenden Bildern und Ordner "Thumbnails" mit den kleinen Vorschaubildchen.

Bis auf die Liste mit den Links liegt die Datei "index.html" fertig programmiert im selben Verzeichnis wie auch das Skript liegen soll.
Das Skript muss daher nur noch den oben angegebenen Code mit den Dateinamen aus den Unterordnern versehen und zusammen der Reihe nach in die index.html einfügen.

Weiß da jemand Rat? Da ich für einen Verein häufig FotoCDs mit über 300 Bildern erstellen muss, wäre mir die copy-und-paste-Variante zu zeitaufwendig...

Content-Key: 54723

Url: https://administrator.de/contentid/54723

Printed on: April 19, 2024 at 01:04 o'clock

Member: bastla
bastla Mar 22, 2007 at 07:01:13 (UTC)
Goto Top
Hallo Polofahrer und willkommen im Forum!

Versuch es einmal damit:
@echo off & setlocal
set "source=600x800"  
set "source2=Thumbnails"  
set "target=rumpf.txt"  
echo ^<body^>>%target%
echo.>>%target%
for /f "delims=" %%i in ('dir %source%\*.jpg /on /b') do call :ProcessLine "%%i"  
echo ^<body^>>>%target%
goto :eof
:ProcessLine
echo ^<a href="./%source%/%~1" rel="lightbox[GV]; target=">>%target%   
echo style="text-decoration: none;"^>^<img src="./%source2%/%~1">>%target%   
echo alt="%~1" border="0" height="150" width="150" /^>>>%target%  
echo.>>%target%
Die Verzeichnisangaben entsprechen Deiner Vorlage. Sollte statt "600x800" doch "600x400" benötigt werden, einfach die entsprechende "set"-Zeile ändern.

Erstellt wird zunächst eine "rumpf.txt", die Du in den Rest der Seite einfügen kannst (siehe auch unten).

Welche Tags (zB "body", ...) geschrieben werden sollen, kannst Du in (weiteren) "echo"-Zeilen festlegen. Bitte beachten: In der allerersten "echo"-Zeile steht nur ">%target%", in allen weiteren ">>%target%" - dadurch wird die Zieldatei immer wieder neu erstellt.

Alle vor bzw nach der erstellten Liste noch benötigten html-Teile könnten in einer "kopf.txt" und einer "fuss.txt" gespeichert werden und mit einem
copy kopf.txt + rumpf.txt + fuss.txt index.html
zusammengefügt werden.

HTH
bastla

[Edit] Hinweise auf Verwendung als "rumpf.txt" hinzugefügt. [/Edit]
Member: miniversum
miniversum Mar 22, 2007 at 07:22:43 (UTC)
Goto Top
ungestestet würd ich es so machen:
@echo off & enabledelayedexpansion
set outfile="links.html"  
set "bigdir=600x800"  
set "smalldir=Thumbnails"  
<b>if exist %outfile% del %outfile%</b>

for /f "delims=" %%i in ('dir %bigdir% /b|find ".jpg"') do (  

echo ^<a href="./%bigdir%/%%i" rel="lightbox[GV]; target=" >>%outfile%  
echo style="text-decoration: none;"^>^<img src="./%smalldir%/%%i" >>%outfile%  
echo alt="%%i" border="0" height="150" width="150" /^> >>%outfile%  
echo.
)

echo ^</html^> >>%outfile%

Hier wird eine Datei namens "links.html" neu erstellt und dann die links entsprechend den Dateien im Verzeichnis "600x800" eingefügt. Das die gleichnamigen Dateien im Verzeichnis "Thumbnails" existieren wird vorausgesetzt.

Willst du das diese links in deine "index.html" hinzugefügt werden, könntest du diese auch angeben. dann must du allerdings die fett gedruckte zeile löschen da diese sonst deine vorhandene "index.html" sonst zuvor löscht. Die links werden allerdings nur am ende angehängt. Brauchst du die links in der mitte der datei müstest du wie das "echo ^</html^> >>%outfile%" am ende der rest drangehängt werden.

miniversum

PS: ups da war woll wer schneller
Member: bastla
bastla Mar 22, 2007 at 07:27:08 (UTC)
Goto Top
@miniversum

da war woll wer schneller
Wahrscheinlich nicht; nur früher ... face-wink

Grüße
bastla
Member: miniversum
miniversum Mar 22, 2007 at 07:31:47 (UTC)
Goto Top
naja ... als ich angefangen hab war noch keine Antwort da... also doch schneller
ich sollte mich von den Studentinnen hier nicht so ablenken lassen glaube ich :D

naja zwei gleiche Antworten sind besser wie keine...

miniversum
Member: bastla
bastla Mar 22, 2007 at 07:36:17 (UTC)
Goto Top
@miniversum

Allerdings: Wen von uns wird man wohl beneiden (den "Schnellen" oder den "Abgelenkten")? 8-)

Grüße
bastla

P.S.: Wenn Du in einem Codeblock fett schreiben möchtest, musst Du html-Tags verwenden (also < b> bzw < /b> ohne Leerstellen).
Member: miniversum
miniversum Mar 22, 2007 at 07:42:10 (UTC)
Goto Top
danke ist korrigiert...

miniversum
Member: Polofahrer
Polofahrer Apr 27, 2007 at 22:29:06 (UTC)
Goto Top
Zunächst mal Vielen Dank für die schnellen Antworten.

Ich habe das Skript von bastla verwendet und es funktioniert super!
Mein Problem: Leider werden die Fotos nach Namen sortiert und nicht nach Aufnahmedatum.

Jetzt habe ich von einem Bekannten noch weitere Fotos bekommen, die mit einer anderen Kamera aufgenommen wurden und daher eine unterschiedliche Dateibenennung aufweisen. Meine Kamera produziert Dateinamen wie "IMG_2746.JPG" und seine Kamera solche wie "dscf1895.jpg".
Kopiert man diese Fotos in ein gemeinsames Verzeichnis (z.B. slideshow) und wendet das Skript an, dann werden die Dateinamen nach dem Namen sortiert in die index.html eingeschrieben.
Diese Reihenfolge entspricht aber nicht der Aufnahmezeit, folglich werden Fotos, die erst Tage später aufgenommen wurden vor denen angezeigt, die zuerst aufgenommen wurden, so wie die Dateinamen zufälligerweise benannt sind.
Gibt es eine Möglichkeit, das Aufnahmedatum auszulesen und die Dateinamen nach der Aufnahmezeit sortiert in die index.html zu schreiben?

Mit Windows XP kann man eine solche Sortierung problemlos erreichen, wenn man die Detail-Ansicht verwendet und mit dem Kontextmenü in der Menüleiste den Menüpunkt "Bild aufgenommen am" auswählt. Könnte das weiterhelfen?

Vielen Dank im Voraus
Grüße vom Polofahrer

P.S.: hier nochmal das Skript:

@echo off & setlocal
set "source=600x800"  
set "source2=Thumbnails"  
set "target=rumpf.txt"  
echo ^<body^>>%target%
echo.>>%target%
for /f "delims=" %%i in ('dir %source%\*.jpg /on /b') do call :ProcessLine "%%i"  
echo ^<body^>>>%target%
goto :eof
:ProcessLine
echo ^<a href="./%source%/%~1" rel="lightbox[GV]; target=">>%target%   
echo style="text-decoration: none;"^>^<img src="./%source2%/%~1">>%target%   
echo alt="%~1" border="0" height="150" width="150" /^>>>%target%  
echo.>>%target% 
Member: Biber
Biber Apr 28, 2007 at 07:10:10 (UTC)
Goto Top
Moin Polofahrer,

es gibt wie immer im Leben mehrere mögliche Strategien, mit dieser neuen Situation umzugehen.

Die Sortierung ist ja in bastlas Lösung "nach Name" durch den Dir-Parameter /on entstanden
(in dem Part "'dir %source%\*.jpg /on /b'").

Ein erster Schritt der Annäherung wäre, statt mit /on mit /od nach Datum Sortieren zu lassen.

Eine weitere Variante wäre, die Sortierung der Bilderganz unabhängig von diesem Mini-Batch festzulegen und aus einer "Bilder-Liste" zu lesen statt den DIR-Befehl zu benutzen.

Diese "Bilder-Liste" wäre nur eine simple Text-Datei mit je einem Bild/Dateinamen pro Zeile.
Und von daher per Skript erzeugbar und auch von Hand bearbeitbar.

Dann hättest Du wenigstens auch die Möglichkeit, von einem starren "nach Namen" oder "nach Datum"-Sortieren wieder wegzukommen.

Das Aufnahmedatum lässt sich mit VBSkript sicherlich auch auslesen - aber passt nicht das "normale" Datei-Datum?

Gruss
Biber
Member: bastla
bastla Apr 28, 2007 at 08:21:15 (UTC)
Goto Top
Hallo Polofahrer!

Um eine um das Aufnahmedatum erweiterte "Bilder-Liste" lt Biber's Vorschlag zu erzeugen, könntest Du vorweg das folgende VBScript einsetzen:
'BilderlisteMitAufnahmedatum.vbs  
'Argument: Voller Pfad (inkl. Laufwerksangabe oder UNC) des Foto-Ordners  
ArgOK = True
If WScript.Arguments.Count = 0 Then
	ArgOK = False
Else
	If Mid(WScript.Arguments(0), 2, 1) <> ":" And Left(WScript.Arguments(0), 2) <> "\\" Then  
		ArgOK = False
	Else
		Set fso = CreateObject("Scripting.FileSystemObject")  
		If Not fso.FolderExists(WScript.Arguments(0)) Then ArgOK = False
	End If
End If
If Not ArgOK Then
	WScript.Echo "Aufruf mit voller Pfadangabe des Foto-Ordners!"  
	WScript.Quit(1)
Else
	Set objShell = CreateObject("Shell.Application")  
	Set objFolder = objShell.Namespace(WScript.Arguments(0))
	For Each strFileName in objFolder.Items
		WScript.Echo objFolder.GetDetailsOf(strFileName, 25) & "_" & strFileName  
	Next
End If
Falls Du das Script zB unter "C:\Scripts\BilderlisteMitAufnahmedatum.vbs" speicherst, könntest Du zum Starten die folgende Batchdatei ("ErstelleBilderliste.bat") verwenden:
@cscript //nologo "C:\Scripts\BilderlisteMitAufnahmedatum.vbs" "%~1" | sort > "D:\Bilderliste.txt"  
Diese Batchdatei kannst Du entweder mit dem vollen Pfad des Foto-Ordners von Hand aufrufen, also etwa
ErstelleBilderliste.bat "D:\Aktuelle Bilder 2007\April"  
oder einfach den entsprechenden Ordner auf die Batchdatei ziehen.

Als Ergebnis erhältst Du eine nach dem Aufnahmedatum sortierte Bilderliste in "D:\Bilderliste.txt" (falls anderer Pfad/Name der Liste gewünscht, dann auch in der folgenden Batchdatei anpassen), welche Du, wie vorgeschlagen, im Editor nach Wunsch noch weiter ordnen kannst.

Die fertige Liste verarbeiten könntest Du dann in weiterer Folge mit dieser etwas veränderten Version der Batchdatei:
@echo off & setlocal
<b>set "liste=D:\Bilderliste.txt"</b>  
set "source=600x800"  
set "source2=Thumbnails"  
set "target=rumpf.txt"  
echo ^<body^>>%target%
echo.>>%target%
<b>for /f "tokens=1* delims=_" %%i in ('type %liste%') do call :ProcessLine "%%j"</b>  
echo ^</body^>>>%target%
goto :eof
:ProcessLine
echo ^<a href="./%source%/%~1" rel="lightbox[GV]; target=">>%target%   
echo style="text-decoration: none;"^>^<img src="./%source2%/%~1">>%target%   
echo alt="%~1" border="0" height="150" width="150" /^>>>%target%  
echo.>>%target%

Grüße
bastla
Member: Polofahrer
Polofahrer Apr 28, 2007 at 19:19:38 (UTC)
Goto Top
Was soll ich sagen? Ihr seid spitze!
Allein hätte ich das nicht geschafft.
Vielen Dank an Bastla, Miniversum und Biber dass Ihr euch Zeit für mein Projekt genommen habt!
Member: Biber
Biber Apr 29, 2007 at 16:36:20 (UTC)
Goto Top
Moin Polofahrer,

machen wir jederzeit gerne wieder.
Bitte setze beim nächsten Mal (beim Skripten gibt es immer ein nächstes Mal) Deinen Beitrag auf "Gelöst", wenn die gestellte Frage nach Deinem Bauchgefühl soweit beantwortet ist, dass Du erstmal wieder weitermachen kannst.

Dieses "Auf-Gelöst-Setzen" ist für mich als Mod das Signal, dass dieser Beitrag geschlossen werden kann.

Dieses Mal mache ich das beides.

Grüße
Biber