2016-05-19 6 views
1

Ich versuche, eine einfache Batch-Datei (n) zu erstellen, auf die ein Benutzer klicken kann. Der Benutzer wird aufgefordert, ein Anfangsdatum und ein Enddatum (Format yyyymmdd) einzugeben und die Dateien mit einem übereinstimmenden Dateinamen zu übertragen.FTP-Dateien mit benutzerdefiniertem Zeitbereich mit Windows-Batch-Zeile?

Die Dateinamen haben das Format yyyymmdd.3P.site.name_address.csv. Also, wenn der Benutzer 20160101 und 20160103 eingegeben hat, dann würde es ftp 3 Dateien (die 3, die mit 20160101, 20160102 und 20160103 starten).

Da das Datumsformat im Dateinamen INT freundlich ist, dachte ich daran, die ersten 8 Zeichen aus den Dateinamen zu analysieren und alle zwischen den Benutzereingaben zu laden.

Mein Problem ist, dass ich nicht weiß, wie man die 2 Benutzereingaben speichert und mit den herausgefilterten Dateinamen vergleicht. Hier ist mein Code derzeit:

test.bat

ftp -i -s:test.ftp 

test.ftp

open ftp.somesite.com 
username 
password 
lcd %UserProfile%\Desktop\ftptest 
cd folderwithfiles 
get 20160518.3P.site.name_address.csv 
bye 

Antwort

1

Sie haben ftp zweimal laufen. Zuerst, um den Eintrag zu bekommen. Dann parsen Sie die Auflistung, finden die gewünschten Dateien, generieren ein neues FTP-Skript mit einem get Befehl für jede passende Datei und führen die ftp erneut aus.

Etwas wie folgt aus:

@echo off 

set HOSTNAME=example.com 
set USERNAME=user 
set PASSWORD=pass 
set SOURCE=/path 
set /P FROM=Date from: 
set /P TO=Date to: 

echo open %HOSTNAME%> ls.txt 
echo %USERNAME%>> ls.txt 
echo %PASSWORD%>> ls.txt 
echo cd %SOURCE%>> ls.txt 
echo ls . list.txt>> ls.txt 
echo bye>> ls.txt 

ftp -s:ls.txt 

del ls.txt 

echo open %HOSTNAME%> get.txt 
echo %USERNAME%>> get.txt 
echo %PASSWORD%>> get.txt 
echo cd %SOURCE%>> get.txt 

rem Some servers will prefix all entries for "ls ." with "./" 
rem For such servers, use the syntax with delims=/ to separate the filename from the prefix. 
rem FOR /F "tokens=1,2 delims=/" %%i in (list.txt) do call :process %%j 
rem But some servers do not add the prefix, for those this will do: 
FOR /F %%i in (list.txt) do call :process %%i 

echo bye>> get.txt 

del list.txt 

ftp -s:get.txt 

del ls.txt 

:process 

set NAME=%1 
set TIME=%NAME:~0,8% 

if "%TIME%" geq "%FROM%" if "%TIME%" leq "%TO%" echo get %NAME%>>get.txt 

exit /b 

Oder, wenn Sie auf Datei Zeitstempel verlassen können, können Sie in der Lage FTP-Client von Dateien auf einem Zeitbereich basiert die Auswahl verwenden.

Zum Beispiel mit WinSCP FTP client kann das Skript so einfach sein wie:

set /P FROM=Date from: 
set /P TO=Date to: 

winscp.com /ini=nul /command^
    "open ftp://user:[email protected]/"^
    "get ""/path/*>=%FROM%<=%TO% 23:59:59"""^
    "exit" 

Die Daten in ein Format yyyy-mm-dd eingegeben werden müssen.

Referenzen:

(ich bin der Autor von WinSCP)

+0

Ich habe eine alternative Lösung mit WinSCP hinzugefügt. –

+0

Danke für die tollen Tipps. Ich möchte mich nicht auf Datei-Zeitstempel verlassen und versuche, dies nur auf Batch-Dateien zu beschränken, damit die Benutzer keinen FTP-Client installieren müssen. Wenn Sie Ihre obige Lösung verwenden, funktioniert etwas nicht. Es ist erfolgreich, die list.txt mit allen Dateinamen zu erstellen, aber die get.txt enthält keine Dateinamen, also vermute ich, dass es ein Problem mit der Schleife gibt. Ich versuche es herauszufinden ... – Crescent

+0

Wie sieht die 'list.txt' aus? –