Ftp server jeden tag neue datei aus dem Ordner reinkopieren?

3 Antworten

Wenn ich nicht weiß wie der Name deiner Datei aussieht kann ich schwerlich festlegen welche Datei gelöscht werden soll.

Mit der Option -i im ftp-Befehl werden gleichnamige Dateien ohne Rückfrage mit der neuen Version überschrieben, insofern muss zuvor garnichts gelöscht werden...

Ansonsten ließe sich ohne weiteres feststellen welche Datei auf dem Server das gestrige Datum hat.

Ich find es schade, das es von Dir kein Feedback zu bereits gegebenen Antworten gibt und es stattdessen nur neue Fragen "hagelt". Wenn wir weiterhelfen sollen kannst Du gern in Form eines Kommentars antworten, das würde es erleichten Dir gezielt zu helfen.

Wie sehen die Namen der Datei aus? Ist das nur eine oder mehrere dateien?

Ich habe mal eine Batch gebaut, welche einfach die Heute geänderten Dateien ermittelt und eine "Löschdatei" mit den ermittelten Dateien schreibt um diese beim nächsten Start der Batch wieder zu löschen.

Meine "mir dem Kopf durch die Wand" Methode, ist erstmal "Narrensicher"

Ich hoffe Du verstehst wenigstens soviel von Batch, das Du dir bei Veränderungen an der Batch nicht irgendwas zerschießt.

Das was passiert habe ich reichlich kommentiert. im Prinzip musst Du nur oben nur deinen Kram eintragen.

demo.cmd

@echo off
chcp 65001 >nul
 rem Hier der Pfad zu deinem lokalen Ordner, servername, Userename, Passwort...
set "localFolder=%userprofile%\desktop\LocalTestfolder"
set "serverName=ftp.demo.net"  &rem 
set "loginName=deinUsername"
set "password=DeinPasswort123"

 rem Steuerdatei: dieser Ordner\ftp.txt
set "FtpFile=%cd%\ftp.txt"
 rem datei welche die Löschbefehle für Morgen aufnehmen wird! (sich merkt was heute hochgeladen wurde)
set "toDeleteFile=%cd%\delFiles.txt"

 rem schreibe alles in die Steuerdatei was bis zur Festlegung der tagesaktuellen Dateien gebraucht wird
@(
 echo open %servername%
 echo %loginName%
 echo %password%
 echo lcd "%localFolder%"
 echo binary
) >"%FtpFile%"

 rem (Lösch-)Befehle von Gestern in Steuerdatei übertragen (wenn es welche gibt)
 rem macht nichts, wenn Du die Batch mehrmals eienm Tag ausführst... wenn die Dateien von heute auf dem Server gelöscht werden, sie werdn ja gleich wieder hochgeladen
type "%toDeleteFile%" 2>nul >>"%FtpFile%"

 rem wichtig! Vor dem ermitteln der heutigen Dateien die alten Löschbefehle entfernen!
(call ) >"%toDeleteFile%"
 rem jetzt ermitteln wir auf ganz normale Batchmanier die Dateien, welche Heute geändert wurden. (siehe Änderungsdatum im Explorer)
pushd "%localFolder%"
for /f "tokens=*" %%a in ('dir /b "*.*"') do (
   rem Datei-Datum von der Uhrzeit trennen
  for /f "tokens=1" %%d in ("%%~ta") do (
     rem wenn Datum der Datei gleich Heute...
    if "%%~d"=="%date%" (
       rem schreibe Transferbefehl in die Steuerdatei
      @(echo mput "%%~nxa") >>"%FtpFile%"
       rem schreibe die Löschbefehle für morgen!
      @(echo mdelete "%%~nxa") >>"%toDeleteFile%"
    )
  )
)
popd

 rem zur Demo mal anzeigen was nun in der Steuerdatei steht (kann weg)
type "%FtpFile%"
echo:

 rem jetzt schreiben wir was sint nch getan werden soll in die Steuerdatei
@(
  rem Befehl um dateien auf dem Server anzuzeigen
 echo dir
  rem verbindung beenden
 echo quit
) >>"%FtpFile%"

 rem zur Demo mal anzeigen was nun in der Steuerdatei steht (kann weg)
echo Inhalt der fertigen Steuerdatei:
type "%FtpFile%"
echo:
echo:
echo jetzt geht's los:

 rem Steurdatei ausführen
ftp -i -s:"%FtpFile%"
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

Wenn das File, das kopiert werden soll, das aktuelle Datum im Namen trägt, ist das doch bereits die Lösung: Kopiere die Datei mit dem aktuellen Datum im Namen. Das aktuelle Datum kannst du in einem Batchscript ja leicht bestimmen.


Erzesel  15.10.2021, 06:48

Das Änderungs-/Erstellungsdatum einer Datei läßt sich in Batch leichter ermitteln, als es aus einem Dateinamen herauszufiltern. (Schon ganz und gar, wenn man nicht weiß nach welchen Kriterien man filtern muss)

Man muss dann lediglich vergleichen ob das Dateidatum dem aktuellen Datum entspricht.

0
mjutu  15.10.2021, 10:21
@Erzesel

Der FS wird wissen, in welchem Format das Datum im Filenamen abgespeichert ist. Dann nach "File_20211015.txt" zu suchen ist trivial.

Bitte poste mal den Code, mit dem du nach einer Datei suchst, die an einem bestimmten Tag geschrieben wurde.

0
Erzesel  15.10.2021, 14:52
@mjutu

trivial:

@echo off
  rem mal dir-Befehl pur, nur Dateien (keine Ordner ). 
  rem Find filtert im "Nackten" Listing"  in deren Ausgabezeile das gewünschte Datum gelistet ist.
  rem default  Änderungsdatum
dir /a-d "*.*"|find "%date%"


echo:
  rem filtern im Schleifenkopf:
  rem filtere Ausgabe auf Token 1=datum,3=Größe (brachen wir nur als Trenner für den Rest) und den Rest= Dateiname um damit etwas zu tun
for /f "tokens=1,3*" %%a in ('dir /a-d "*.*"^| find "%date%"') do (
  echo ich mache was mit einer Datei zuletzt geändert : am %%~a.
  echo Ich, "%%~fc" wurde entdeckt.
)


echo:
 rem das filten im Kopf kann jedoch nach hinten losgehen (zb. wenn eine Datei "bitte am 15.10.2021 öffnen.txt" existiert, die aber  vor Wochen erstellt wurde)
 rem find schaut nicht  auf die Position im String und  findet alles...
 rem dann ist "dir /b /a-d "*.*" angesagt und das Auswerten  des ZeitParameters %%~ta im Schleifenrumpf (bei einem "blndflug" in fremden Dateisystemen die bessere Variante)
 rem  hier   neme ich zur Demo mal  des Erstellungsdatum  /tc statt "geändert am" 
for /f "tokens=*" %%a in ('dir /b /a-d  "*.*"') do (
   rem Datei-Datum von der Uhrzeit trennen
  for /f "tokens=1" %%d in ("%%~ta") do (
     rem wenn Datum der Datei gleich Heute...
    if "%%~d"=="%date%" (
       echo ich mache was mit "%%~a" erzeugt am %%~d
    )
  )
)
echo:
 rem alternativ ginge auch innerhalb des Rumpfes mit find zu testen ist aber viel langsamer.
for /f "tokens=*" %%a in ('dir /b /a-d  "*.*"') do (
    echo %%~ta | find "%date%" >nul &&(
        echo ich mache was mit "%%~a" erzeugt am %%~ta
    )
)

pause
Der FS wird wissen, in welchem Format das Datum im Filenamen abgespeichert ist

Sicher... Um dazu Ratschläge zu geben muss mir erstmal bekannt sein, welches Namensformat die Datei des FS kennen.

Meine magische Glaskugel ist in der Pfandleihe also auch nix mit Hellsehen...

Ich vermute mal, das es im Sinne des FS ist nicht jeden Tag das Datum von Hand einzugeben. Dann könnte man auch gleich jeden Tag die nötigen 6 Zeilen direkt in die FTP-Console tippen.

Die bisherige Fragerei lässt eher darauf schließen das der FS bestenfalls rudimentäre Batchkentnisse hat. In Sachen Rückfragen und Feedback war er eher unkooperativ.

Um im Dateinamen zu filtern muss man hingegen erstmal das regionale %date%-format umbauen.

  rem deutsches Datum umbauen nach yyyymmdd und 
for /f "tokens=1-3 delims=." %%a in ("%date%") do (set "globDate=%%c%%b%%a")
echo %globDate%

rem mal eine Demo-Datei erzeugen 
echo:>"MyFile_%globDate%.txt"
 rem dann lässt sich natürlich nach dem Dateinamen suchen
 for %%a in ("MyFile_%globDate%.txt?") do ( echo blubb: %%a)
pause
0
mjutu  15.10.2021, 16:37
@Erzesel

Man könnte sich den TimeStamp auch sicherer über die PowerShell besorgen:

FOR /f "delims=" %%a in ('
 powershell -Command "Get-Date -format 'yyyy-MM-dd HHmmss'"
') DO SET "TimeStamp=%%a"

Oder über WMIC, solange es noch läuft:

FOR /F "delims=" %%a in ('
   ^"WMIC OS Get localdatetime ^| find "."^"
') DO SET dt=%%a
SET TimeStamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2% %dt:~8,2%%dt:~10,2%%dt:~12,2%

Das wäre dann nicht mehr vom regionalen Format abhängig und man kann es leicht an das Format angleichen, dass im Filenamen benutzt wird.

0

Entweder nimmst du einfach die zuletzt erzeugte Datei, oder du baust dir das Datum in einer Variable zusammen. Das hat der Ersteller der Datei ja auch gemacht.