soidberg
Goto Top

Dateinamen aus Ftpverzeichnis auslesen, in HTML-Links umwandeln und in .txt speichern

Hallo liebe Administratoren,

ich habe hier eine Aufgabe mit der ich alleine wohl nicht (rechtzeitig) fertig werde.

Folgendes Problem:

Ich muss ca 300 .pdf Dateien auf unseren Dokumenteserver verschieben und als html-link in eine Liste eintragen.


Idee:

Eine .bat (gesteuert durch eine .ini) mit temporären .vbs....

1) Die .bat wird gestartet und zieht sich aus einer .ini die Daten zum connecten des ftp.
2) Es wird ein vbs. gestartet in dem der auszulesende Unterordner eingegeben werden kann.
3) Die .bat übernimmt die Eingabe aus dem Skript und springt in das eingegebene Verzeichnis.
4) Alle Dateien mit der Endung .pdf werden ausgelesen
5) Die Pfade (bsp. /html/Jänner/Messe/ALL) werden in Html-Links umgewandelt (bsp: hllp://Firma.de/html/Jänner/Messe/ALL/--->Dateiname<---.pdf) und in einer .txt gespeichert.


Wer kann mir denn da auf die schnelle mal helfen? Das ganze steht am Montag an und ich komme mit Google bzw. der Suchfunktion des Forums nicht wirklich (funktionstüchtig) weiter.

Gruß Soidberg

Content-Key: 64378

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

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

Member: bastla
bastla Jul 21, 2007, updated at Oct 18, 2012 at 16:32:13 (UTC)
Goto Top
Hallo Soidberg!

... mit temporärem .vbs....
Irgendwie fühle ich mich angesprochen ... face-wink

Ab Punkt 2 etwa so:
@echo off & setlocal
set "Txt=Ergebnis.txt"  
set "Dom=http://Firma.de"  

set "Verz=%temp%\VerzeichnisHolen.vbs"  
echo Set V=CreateObject("Shell.Application").BrowseForFolder(0,"Verzeichnis wählen",16,17)>"%Verz%"  
echo If Not TypeName(V)="Nothing" Then Set B=V.Self:WScript.Echo B.Path>>"%Verz%"  
set Quelle=
for /f "delims=" %%i in ('cscript //nologo "%Verz%"') do set "Quelle=%%i"  
if not defined Quelle goto :Fehler
pushd "%Quelle%"  
if exist "%Txt%" del "%Txt%"  
for %%i in (*.pdf) do call :ProcessFile "%%i"  
type "%Txt%"  
:: ... und was sonst noch anliegt (copy oder move oder ...)
popd
goto :eof
:ProcessFile
set "Pfad=%~pnx1"  
set Pfad=%Pfad:\=/%
echo %Dom%%Pfad%>>"%Txt%"  
goto :eof
:Fehler
echo Es wurde kein Verzeichnis ausgewählt!

Für FTP siehe zB FTP Kommandos automatisieren

Grüße
bastla
Member: bastla
bastla Jul 21, 2007 at 20:27:20 (UTC)
Goto Top
So, jetzt die Punkte 2) - 5) als Skizze oben, allerdings frage ich mich, wozu 2) und 3) dienen, wenn es nur um ein bestimmtes bekanntes Verzeichnis gehen soll ...

... und Punkt 1) hat (in der aktuellen Formulierung) mit dem Rest eigentlich gar nix zu tun (außer als Vorbereitung für 4b und/oder 6).

Grüße
bastla
Member: Soidberg
Soidberg Jul 21, 2007 at 21:48:16 (UTC)
Goto Top
Hy Bastla,

ja habe da tatsächlich etwas an Dich gedacht face-smile

Ich habe mich aber auch mal wieder etwas undeutlich ausgedrückt.

"2) Es wird ein vbs. gestartet in dem der auszulesende Unterordner eingegeben werden kann." Damit meine ich einen Unterordner auf dem Server.

Der Hintergrund ist ganz einfach, ich darf zukünftig lustiges Daten schieben veranstalten (vielen Dank an meinen Chef *grummel*) und die Unterordner in denen die Files auf den Servern liegen sind immer unterschiedlich.

Das Tool was ich bräuchte muss sich also auf den Server connecten, mich dann fragen welcher Unterordner auf dem Server ausgelesen werden soll und dort dann alle Dateien mit einer bestimmten Endung (in diesem Fall .pdf) erkennen und mir die html Links lokal in eine .txt speichert.

Somit brauche ich dann nur die Dateien hoch zuschieben, sage dem Tool über die .ini alle Daten und das Tool wirft mir eine Liste aus, Beispiel:

hllp:Fima2.de/Jänner/Messe/All/Test.pdf
hllp:
Fima2.de/Jänner/Messe/All/beispiel.pdf
hllp://Fima2.de/Jänner/Messe/All/möglichkeit.pdf
usw.

Die Liste der Files muss ich dann in eine andere Abteilung geben die damit weiterarbeitet.

Ich hoffe ich konnte es (um diese Zeit) noch etwas verständlicher erklären.

Gruß Soidberg
Member: bastla
bastla Jul 22, 2007 at 01:24:27 (UTC)
Goto Top
Hallo Soidberg!

Also eher so:

@echo off & setlocal
set "ftpS=ftp.server.de"  
set "User=Username"  
set "Pass=Passwort"  
set "Txt=D:\Ergebnis.txt"  
set "Dom=http://Firma.de"  
set "ini=D:\ftpini.txt"  
set "Ext=.pdf"  

set "Verz=%temp%\VerzeichnisHolen.vbs"  
echo Set V=CreateObject("Shell.Application").BrowseForFolder(0,"Verzeichnis?",0,"ftp://%User%:%Pass%@%ftpS%")>"%Verz%"  
echo If Not V Is Nothing Then Set F=V.Self:P=F.Path:WScript.Echo Mid(P,Instr(Instr(P,"@")+1,P,"/"))>>"%Verz%"  
for /f "delims=" %%i in ('cscript //nologo "%Verz%"') do set "Quelle=%%i"  
del "%Verz%"  
if not defined Quelle goto :Fehler
echo open %ftpS%>"%ini%"  
echo %User%>>"%ini%"  
echo %Pass%>>"%ini%"  
echo dir %Quelle%*%Ext%>>"%ini%"  
echo quit>>"%ini%"  
if exist "%Txt%" del "%Txt%"  
for /f "delims=" %%i in ('ftp -s:"%ini%"^|findstr /v "ftp^> dir"^|findstr "%Ext%"') do set "Zeile=%%i" & call :ProcessLine  
if exist "%ini%" del "%ini%"  
type "%Txt%"  
:: ... und was sonst noch anliegt (copy oder move oder ...)
goto :eof

:ProcessLine
echo %Dom%%Zeile:~55%>>"%Txt%"  
goto :eof
:Fehler
echo Es wurde kein Verzeichnis ausgewählt!

Neben der Anpassung der "set"-Zeilen am Anfang habe ich zum Testen in der viertletzten Zeile die Stellenanzahl der Zeichen, die vor dem benötigten Teil des "ftp-dir"-Ergebnisses zu entfernen sind (also etwa "-rw-r----- ..."), konstant mit 55 festgelegt - die automatische Zerlegung der Zeile reiche ich vielleicht im Lauf des Sonntags nach (obwohl diese Anzahl eigentlich recht konstant sein müsste).

Vielleicht könntst Du zur Sicherheit einmal eine solche Zeile mit dem "dir"-Befehl von "ftp" erstellen und posten. Bei meinen Tests sah die etwa so aus (Pfad und Dateiname frei erfunden, aber im Format entsprechend):
-rw-r-----   1 web      web         12042 Dez 11 14:37 /test/tabellen/tab-50-ghp.html

Der Teil vor "/test..." ist die besagten 55 Zeichen lang.

Grüße
bastla

[Edit] Konstante "http://firma.de" durch Variable %Dom% ersetzt. [/Edit]
Member: bastla
bastla Jul 22, 2007 at 15:44:41 (UTC)
Goto Top
Hallo Soidberg!

Unter der Voraussetzung, dass eine "dir"-Zeile bei Dir vergleichbar aussieht, könntest Du ersatzweise die folgende "for"-Zeile verwenden und das Unterprogramm ":ProcessLine" weglassen:

for /f "tokens=1* delims=/" %%i in ('ftp -s:"%ini%"^|findstr /v "ftp^> dir"^|findstr "%Ext%"') do echo %Dom%/%%j>>"%Txt%"  
Damit wird alles nach dem ersten "/" als auszugebender Dateipfad betrachtet.

Grüße
bastla
Member: Soidberg
Soidberg Jul 26, 2007 at 11:19:58 (UTC)
Goto Top
Ich habe noch mal Glück, das ganze wurde auf Mittwoch verschoben.

Ich schaue mir das mal heute abend an wenn ich daheim bin an und werde sofort berichten.

Gruß Soidberg
Member: Soidberg
Soidberg Jul 26, 2007 at 18:01:15 (UTC)
Goto Top
So, ich konnte es mal testen und muss sagen ich bin begeistert!!

Ich habe zwar noch ein paar "Fehler" gefunden aber im Grunde funktioniert dein Vorschlag schon richtig gut.

Folgende Probleme an denen noch zum generellen Einsatz gefeilt werden müsste:

1) Die Ergebnis.txt sieht bei mir so aus:
http://Domain.de /html/Messe/Jänner/01.pdf
http://Domain.de /html/Messe/Jänner/02.pdf
http://Domain.de /html/Messe/Jänner/03.pdf
http://Domain.de /html/Messe/Jänner/04.pdf
http://Domain.de /html/Messe/Jänner/05.pdf
http://Domain.de /html/Messe/Jänner/06.pdf
http://Domain.de/html/Messe/Jänner/07.pdf

Hinter Domain.de wird bei allen (bis auf den letzten Link!) ein Leerzeichen belassen.

2) Wir besitzen auf dem Server ein "html" Verzeichnis, ab dort beginnt sozusagen erst die Homepage. Die Links müssten ohne den Ordner "html" ausgegeben werden:
http://Domain.de/Messe/Jänner/01.pdf
http://Domain.de/Messe/Jänner/02.pdf
http://Domain.de/Messe/Jänner/03.pdf
http://Domain.de/Messe/Jänner/04.pdf
http://Domain.de/Messe/Jänner/05.pdf
http://Domain.de/Messe/Jänner/06.pdf
http://Domain.de/Messe/Jänner/07.pdf



Schönheitsfehler (an denen kann man später arbeiten):

1) Da das ganze später eine .exe wird und keine Shell zu sehen sein wird, müssten wir die Textausgaben entweder auch in eine .vbs Ausgabe packen oder ich (das bekomme ich dann doch hin) lasse es etwas unschön in eine ERROR.txt exportieren.

2) Da die spätere .exe auch nicht mehr beschreibbar sein wird (mir gefallen .exe´n einfach besser) wäre es gut wenn wir die "Set´s" in eine .ini auslagern können. Dazu müsste aber dein kompletter Code umgestellt werden und das bekomme ich dann doch wieder nicht hin. Für Mittwoch langt erstmal die jetzige Version, die Ausgabefehler etc bekomme ich mit´m Editor weg, ist also auch mehr was für später wenn es ans verfeinern geht.

3) Da ja das Tool auch bei anderen funktionieren soll (falls es einer braucht) wäre es gut wenn man aktiv (eventuell wieder per .vbs) nach der Ordner Auswahl noch bestimmen könnte ob "nur dieser Ordner" oder "Alle Unterordner" mit durchsucht werden sollen....

Wobei mir schon klar ist das diese Bonusfunktion an die Grenzen der "kleinen Programmierung" stößt. Sollte es nicht machbar sein, so ist das verträglich!

P.S. Die Pfadangaben in deinem Original (D:\) habe ich mal durch %CD% ersetzt.

*Vielen lieben Dank soweit*

EDIT:
Mit deiner 2ten Varianter der FOR Schleife werden die Links auch ohne Leerzeichen ausgegeben! Mit dieser Variante würde also nur noch das Problem mit dem "html" Ordner übrig bleiben...


Gruß Soidberg
Member: bastla
bastla Jul 26, 2007 at 19:35:36 (UTC)
Goto Top
Hallo Soidberg!

Welche Variante hast Du verwendet? Ich nehme an, die zweite (mit "for"-Schleife statt "call") - in diesem Fall sollte zumindest einmal Problem 2) (überflüssiges "/html") so zu lösen sein, dass Du auf "tokens=2*" änderst.

Zu 1) fällt mir eigentlich auf Anhieb nix ein - kannst Du einmal ein "ftp-dir"-Listing reinstellen?
Schönheitsfehler 1) Derzeit gibt es (soweit ich sehe) keine Textausgaben (das "type" steht nur aus Testgründen dort) ...

2) Mein Code sollte weitestgehend so bleiben können wie bisher, nur dass eben die "set"-Zeilen am Anfang aus der ".ini" befüllt werden müssen.

Grüße
bastla

[Edit] Hatte Dein Edit noch nicht gesehen ... [/Edit]
Member: bastla
bastla Jul 26, 2007 at 21:41:42 (UTC)
Goto Top
... als Ergänzung zum Einlesen der Variablen ("Schöheitsfehler 2)"):
Wenn die entsprechende ".ini"-Datei etwa folgenden Inhalt hat:
ftpS=ftp.server.de
User=Username
Pass=Passwort
Dom=http://Firma.de
Ext=.pdf
kannst Du mit
for /f "tokens=1* delims==" %%i in (ini.txt) do set "%%i=%%j"  
alle Variablen setzen.

Grüße
bastla
Member: Soidberg
Soidberg Jul 28, 2007 at 22:47:35 (UTC)
Goto Top
Da ich meinen Text nicht posten kann (wid einfach nicht angezeigt) schicke ich Ihn Dir gerade per PN...

Gruß Soidberg
Member: bastla
bastla Jul 29, 2007 at 03:18:52 (UTC)
Goto Top
Hallo Soidberg!

(Ungetesteter) Letztstand:

@echo off & setlocal
for /f "tokens=1* delims==" %%i in (ftplister.ini) do set "%%i=%%j"  
set "ini=%temp%\ftpdata.txt"  
set "Verz=%temp%\VerzeichnisHolen.vbs"  
set "Txt=Ergebnis.txt"  
set "LOG=ERROR.LOG"  

if exist "%LOG%" del "%LOG%"  
if exist "%Txt%" del "%Txt%"  
echo Set V=CreateObject("Shell.Application").BrowseForFolder(0,"Bitte das Verzeichnis auswählen",0,"ftp://%User%:%Pass%@%ftpS%")>"%Verz%"  
echo If Not V Is Nothing Then Set F=V.Self:P=F.Path:WScript.Echo Mid(P,Instr(Instr(P,"@")+1,P,"/"))>>"%Verz%"  
for /f "delims=" %%i in ('cscript //nologo "%Verz%"') do set "Quelle=%%i"  
del "%Verz%"  
if not defined Quelle goto :Fehler

echo open %ftpS%>"%ini%"  
echo %User%>>"%ini%"  
echo %Pass%>>"%ini%"  
echo dir %Quelle%*%Ext%>>"%ini%"  
echo quit>>"%ini%"  
for /f "tokens=%Slash%* delims=/" %%i in ('ftp -s:"%ini%"^|findstr /v "ftp^> dir"^|findstr "%Ext%"') do echo %Dom%/%%j>>"%Txt%"  
if exist "%ini%" del "%ini%"  
"%Txt%"  
goto :eof

:Fehler
echo.>%LOG%
echo Es wurde kein Verzeichnis zum auslesen ausgewählt oder das Programm wurde vorzeitig beendet!>>%LOG%
echo.>>%LOG%
echo Bitte starten Sie das Tool neu, warten Sie einen Moment (ca.5-10 Sekunden, je nach Internetanbindung) und wählen Sie dann einen Ordner aus.>>%LOG%
"%LOG%"  
goto :eof
Dazu die "ftplister.ini:"

 ftpS=ftp.server.de
User=Tester01
Pass=Testerpass01
Dom=http://ftp.serve.de
Slash=2
Ext=.pdf

Die auszugebende Verzeichnisebene wird jetzt, Deinem Vorschlag entsprechend, über die Variable %Slash% gesteuert (obwohl %DirLevel% vielleicht aussagekräftiger wäre). Ansonsten habe ich nur zur Sicherheit einige Anführungszeichen ergänzt und damit hoffentlich nix verschlimmbessert. face-wink

Grüße
bastla
Member: Soidberg
Soidberg Jul 31, 2007 at 17:28:53 (UTC)
Goto Top
Ja das ist was ich brauche. Der benötigte Funktionsumfang wurde hier sogar übertroffen!

Ich bin schwer begeistert und ziehe (mal wieder) meinen Hut. Merci dafür, das ganze erleichtert mir meinen morgigen Tag um Stunden und ich bekomme die Möglichkeit meinem Chefchen ein paar große Augen machen zu können, denn....

Man muss nicht alles wissen/können, man muss nur wissen wen /wo man fragt. ;)

Hier wurde mir geholfen. face-smile

Im Prinzip können wir unser Projekt (meine Idee, deine Ausführung) der Allgemeinheit zur Verfügung stellen oder wir basteln noch an Feinheiten:

- Statusanzeige (damit der User sieht das der ftplister auch noch ausliest/ braucht bei großen Verzeichnissen recht lange)

- Option "Nur diesen Ordner auslesen" und " Diesen & Alle Unterordner auslesen"

Ansonsten ist es ein Glanzwerk !!!

Ich wünsche Dir jetzt erstmal einen schönen Urlaub, wir quasseln wenn du wieder da bist drüber.

P.S. Die .exe schiecke ich Dir gerne per PN wenn du möchtest.

EDIT:

Nochmal vielen Dank, Arbeitszeit der Umzugsaktion ca. 2 Stunden face-smile Ohne tool wohl ein paar mehr. ;)

Gruß Soidberg