littleflame
Goto Top

Per Batch Dateien in einem gewissen Ordner je nach Dateiendung über FTP archivieren

Schönen Samstag an alle.
Ich verbringe meinen Samstag gerade damit, ein bisschen mit meinem FTP zu spielen. Leider bin ich noch ganz neu in der "Branche" und habe deshalb etwas Nachhilfe nötig. Eventuell findet sich ja der ein oder andere, der mir behilflich sein möchte.
Vielleicht ist es ja ganz einfach. Ne lustige Bastelei ist es allemal:

Ich habe versucht, einen ähnlichen Beitrag zu finden, habe jedoch nichts dergleichen entdeckt.
Wenn trotzdem bereits vorhanden, bitte ich nur um eine kurze Ohrfeige und den Link
Also: Mein Problem:
Ich möchte per Batch alle Dateien eines gewissen Ordners je nach Dateiendung per FTP in gewisse Ordner auf mein NAS übertragen.
Ich weiss, es wäre ohne Batch evtl einfacher realisierbar, aber man kennt das ja, egal ob es einen einfacheren Weg gibt: Wenn das Script nicht funktioniert, dann will man es zum laufen kriegen face-wink
Momentan scheitere ich jedoch daran, die Dateien sauber in die (eventuell) benötigte Ftp-Datei zu schreiben.
Ich habe momentan zwei Ideen, wie ich das ganze lösen möchte, stehe jedoch bei beidem momentan etwas auf dem Schlauch

Also hier mal meine bisherigen Basteleien:

Möglichkeit 1 per extra FTP-Datei:

echo on

rem Nun folgt der zu archivierende Ordner
cd c:\Ftp

rem Und hier liegen meine Scripts immer
dir /B > C:\Batch\dateien.txt


rem Variablen für die Dateiendungen
set mp3=Mp3s & set jpg=Bilder & set mpg=Videos & set avi=Videos & set iso=Images & set nfo=Images & set rar=Temp & set bat=Batch
cd C:\Batch

rem Und nun folgt der Teil in dem ich den Fehler vermute
for /f "tokens=2 delims=. " %%i in (dateien.txt) do

rem In der FTP datei fehlt hier natürlich dann noch das jeweilige "Send + späterer Ordnername"
rem Gewünschter Effekt: dateiname.dateiendung /
echo %i.%j /!%j! > send.txt
ftp.exe -n -i -s:send.txt
disconnect
quit



Möglichkeit 2 mit nur einer Datei:


echo on
set mp3=Mp3z & set jpg=Bilder & set mpg=Videos & set avi=Videos & set iso=Images & set nfo=Images & set rar=Temp & set bat=Batch
cd C:\FTP
for /f "tokens=2 delims=." %%i in (*.*) do
ftp.exe -n -i
open "ftpadresse"
login
passwort
send %i.%j /!%j!
disconnect
quit


(Kommentare hab ich beim zweiten mal weggelassen. Gewünschter Effekt is ja der selbe)

Und noch ne kurze Frage zu Möglichkeit 2:
Hier ist es doch so, dass für jede Datei die FTP verbindung neu hergestellt wird. Ist es möglich die Verbingdung vorher herzustellen und die Variablen dann einzulesen?

Wie gesagt: Bin recht neu, deshalb habt Erbarmen, wenn das Script ganz schrecklich ist. (*Z.b. Bastla oder Biber anschau*)

Vielen Dank im voraus und schönes Wochenende noch

LittleFlame

Content-Key: 120765

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

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

Member: bastla
bastla Jul 18, 2009 at 19:55:21 (UTC)
Goto Top
Hallo LittleFlame!

Vorweg: Die Variante 1 hätte aus meiner Sicht den (zusätzlichen) Vorteil, dass durch die erstellte "send.txt" dokumentiert wird, welche Dateien verarbeitet wurden (mein Vorschlag unten kommt ohne eine "dateien.txt" aus und berücksichtigt auch nur die vorgesehenen Dateitypen) ...
Grundsätzlich sollte sich das etwa so wie von Dir skizziert machen lassen, hinsichtlich der Batch-Details (und besonders der "for"-Schleife) besteht allerdings tatsächlich noch Optimierungspotenzial face-wink.
Schematisch, ungetestet und als formatiert könnte das dann etwa so aussehen:
@echo off & setlocal enabledelayedexpansion
set "Ordner=c:\Ftp"  
set "send=C:\Batch\send.txt"  

set "mp3=Mp3s" & set "jpg=Bilder" & set "mpg=Videos" & set "avi=Videos"  
set "iso=Images" & set "nfo=Images" & set "rar=Temp" & set "bat=Batch"  

::in den Ordner wechseln
pushd "%Ordner%"  
::Kopf der ftp-Datei erstellen
>"%send%"  echo open "ftpadresse"  
>>"%send%" echo login  
>>"%send%" echo passwort  
::Schleife über alle Dateien
for /f "tokens=1-2 delims=." %%i in ('dir /b') do if defined %%j >>"%send%" echo send %%i.%%j /!%%j!  
::Fuß der ftp-Datei
>>"%send%" echo disconnect  
>>"%send%" echo quit  

::und ab dafür ...
ftp.exe -n -i -s:"%send%"  

::der Ordnung halber:
popd
Mit dem "if defined %%j" in der "for"-Schleife soll errreicht werden, dass die Verarbeitung auf die vorgegebenen Dateitypen beschränkt wird - wenn sich also im untersuchten Ordner eine "txt"-Datei befindet, es aber keine Variable %txt% gibt, wird diese Datei auch nicht in die "send.txt" aufgenommen. Wenn Du diese Einschränkung nicht machen willst (und damit leben kannst, dass alle nicht berücksichtigten Dateitypen als Ziel den Root-Ordner "/" erhalten) kannst Du die "defined"-Prüfung auch weg lassen.
Noch eine Anmerkung: Durch die "delayedExpansion" und die Aufteilung der Dateinamen am "." wird es Probleme mit Dateien, welche im Namen "!" oder "." enthalten, geben. Zumindest die "delayedExpansion" ließe sich durch die folgende Zeile umgehen:
for /f "tokens=1-2 delims=." %%i in ('dir /b') do if defined %%j >>"%send%" call echo send %%i.%%j /%%%%j%%
Damit auch die Zerlegung keine Probleme bereitet, könnte die Zeile etwa so aussehen:
for %%i in ("%Ordner%\*.*") do if defined %%~xi >>"%send%" call echo send "%%~nxi" /%%%%~xi%%
Dann müssten allerdings die Ordner je Typ nach dem folgenden Muster festgelegt werden:
set ".mp3=Mp3s"
da "%%~xi" nicht nur den Typ, sondern auch den "." liefert.

Grüße
bastla
Member: LittleFlame
LittleFlame Jul 18, 2009 at 20:09:32 (UTC)
Goto Top
Sodala... Ich fühl mich ja schon fast geehrt, dass meine Frage von dir beantwortet wurde. Hab schon viele Posts von dir gelesen.
Ich hoffe, dass ich mich mit meinem Batch "Versuch" nicht ganz blamiert habe ^^
Ich werde deine Lösung gleich mal testen und Info geben, ob sie so funktioniert, obwohl ich mir ziemlich sicher bin, dass es richtig is.

Schönen Abend noch, falls man sich heute nichtmehr schreibt face-smile

Grüße LittleFlame
Member: LittleFlame
LittleFlame Jul 19, 2009 at 13:57:53 (UTC)
Goto Top
Hallo Bastla

Hmmm, ok. Ich bin gerade am testen und es sieht gut aus. Aber ich hätte noch ne Frage:
Was bewirkt in diesem Fall das folgende nach dem "if defined"?

do if defined %%~xi >>"%send%" call echo send "%%~nxi" /%%%%~xi%%

das ~x und das ~nx sind mir neu.

Wie gesagt, bin n ziemlicher Frischling auf dem Gebiet.

Danke schonmal.
Member: bastla
bastla Jul 19, 2009 at 14:11:37 (UTC)
Goto Top
Hallo LittleFlame!
Was bewirkt in diesem Fall das folgende nach dem "if defined"?
Mit
 >>"%send%"
wird festgelegt, dass das Ergebnis der folgenden Anweisung an die "send.txt" angefügt werden soll.
Das "call" erspart die "delayedExpansion", indem es in einem neuen CMD-Kontext den Rest der Zeile auflöst, wofür die Schreibweise mit jeweils verdoppelten %-Zeichen erforderlich ist:
/%%%%~xi%%
wird damit zu (für die Beispieldatei "test.jpg")
/%.jpg%
und nach der Ausgabe per "echo" daher zu
/Bilder
Durch
%%~xi
wird aus dem übergebenen Dateinamen (bzw -pfad) in %%i (im Beispiel also "test.jpg") die Extension .jpg extrahiert.
Analog dazu liefert
%%~ni
nur den Dateinamen (ohne Pfad davor und Typ dahinter), also: test

Nachzulesen ist das in der Hilfe zu "for" (for /?) gegen Ende ...

Grüße
bastla
Member: LittleFlame
LittleFlame Jul 20, 2009 at 09:13:12 (UTC)
Goto Top
Hallo Bastla,

noch einmal vielen Dank.
Habe zwar schon mehrfach die "for" Hilfe gelsen, aber der Teil scheint mir wieder entfallen zu sein.
Meinerseits ist alles ok und verstanden. Ich bedanke mich für die Hilfe und Geduld.
Thread gelöst.

Danke,

LittleFlame