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
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 120765
Url: https://administrator.de/contentid/120765
Ausgedruckt am: 04.11.2024 um 22:11 Uhr
5 Kommentare
Neuester Kommentar
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 .
Schematisch, ungetestet und als formatiert könnte das dann etwa so aussehen:
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:
Damit auch die Zerlegung keine Probleme bereitet, könnte die Zeile etwa so aussehen:
Dann müssten allerdings die Ordner je Typ nach dem folgenden Muster festgelegt werden:
da "%%~xi" nicht nur den Typ, sondern auch den "." liefert.
Grüße
bastla
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 .
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
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%%
for %%i in ("%Ordner%\*.*") do if defined %%~xi >>"%send%" call echo send "%%~nxi" /%%%%~xi%%
set ".mp3=Mp3s"
Grüße
bastla
Hallo LittleFlame!
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:
wird damit zu (für die Beispieldatei "test.jpg")
und nach der Ausgabe per "echo" daher zu
Durch
wird aus dem übergebenen Dateinamen (bzw -pfad) in %%i (im Beispiel also "test.jpg") die Extension
Analog dazu liefert
nur den Dateinamen (ohne Pfad davor und Typ dahinter), also:
Nachzulesen ist das in der Hilfe zu "for" (
Grüße
bastla
Was bewirkt in diesem Fall das folgende nach dem "if defined"?
Mit >>"%send%"
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%%
/%.jpg%
/Bilder
%%~xi
.jpg
extrahiert.Analog dazu liefert
%%~ni
test
Nachzulesen ist das in der Hilfe zu "for" (
for /?
) gegen Ende ...Grüße
bastla