使用Windows批处理文件从FTP服务器下载今天的文件

使用Windows批处理文件从FTP服务器下载今天的文件

问题描述:

我试图将XML文件从FTP位置复制到应用程序服务器 - 但不是所有文件。新文件在ftp位置每隔半小时存档一次。我只需要根据时间戳和日期传输新文件。使用Windows批处理文件从FTP服务器下载今天的文件

我目前使用以下2个文件从FTP位置复制所有文件。

批处理文件:

ftp -i -s:D:\ftp_commands.txt -n <host name> 

文本文件(ftp_commands.txt):

user <username> <password> 
cd <source path> 
lcd <destination path> 
mget * 
bye 

谁能帮我复制基于时间戳或日期的文件?

+0

我不认为这是可能的与Windows的''ftp'工具... – aschipfl

+0

是的,如果时间戳是文件名的一部分,这可能是可能的,但我不知道用ftp获取最后修改日期的方法。 – SomethingDark

+0

你是什么意思*»只传输新文件«*?你想复制一定的最大年龄的文件,或者你需要一定数量的最新文件吗?后者可以很容易地使用'ftp.exe'实现... – aschipfl

使用Windows批处理文件和内置FTP客户端(ftp.exe)实现这是一个非常复杂的任务。

使用PowerShell或其他更强大的语言会更容易。


使用功能更强大的FTP客户端甚至更容易。

例如WinSCP FTP client支持时间限制。

用的WinSCP,一个批处理文件来下载今天的文件是微不足道的:

winscp.com /ini=nul /log=todays.log /command^
    "open ftp://username:[email protected]/"^
    "get /remote/path/*>=%%TIMESTAMP#yyyy-mm-dd%% C:\local\path\"^
    "exit" 

它使用%TIMESTAMP% syntaxfile mask with a time-constraint

参见:

(我的WinSCP的作者)

+0

你说*这是一个非常复杂的...... * *,这是否意味着它可以用'ftp.exe'实现? – aschipfl

+1

@aschipfl [“批处理文件”是图灵完整语言](https://stackoverflow.com/q/11126539/850848),所以任何事情都是可能的 - 运行'ftp.exe'一次以列出远程目录 - 解析列表在一个非常复杂的批处理文件中挑选今天的文件 - 基于此,生成一个新的'ftp.exe'脚本来下载选择的文件。 –

+1

我明白了,谢谢!所以在将来使用术语[*»不可能«*]时,我必须更加小心(https://stackoverflow.com/questions/44663446/download-only-todays-files-from-ftp-server-using- windows-batch-file/44668702#comment76313668_44663446)... – aschipfl

由于用户Martin Prikrylcomment指出的那样,可以使用Windows的本地FTP命令ftp.exe来实现自己的目标,虽然它可能不那么容易。所以我不得不接受挑战...

这是一个脚本,下载给定数量的最新(最新)文件。这可以修改为考虑时间戳而不是计数,但由于日期/时间格式可能取决于FTP主机和/或本地机器,并且我不知道在执行FTP命令dir时接收的格式是什么,我决定先去伯爵。所以这里是:

@echo off 
setlocal EnableExtensions DisableDelayedexpansion 

rem // Define constants here: 
set "_FTP_LIST=%TEMP%\ftp_list_%RANDOM%.txt" & rem // (FTP script for listing files) 
set "_FTP_RECV=%TEMP%\ftp_recv_%RANDOM%.txt" & rem // (FTP script for getting files) 
set "_FTP_LTMP=%TEMP%\ftp_list_%RANDOM%.tmp" & rem // (file to store remote file list) 
set "_FTP_HOST=<host name>"  & rem // (name of FTP host) 
set "_FTP_USER=<username>"   & rem // (user name to login to the FTP host) 
set "_FTP_PASS=<password>"   & rem // (pass word to login to the FTP host) 
set "_FTP_RSRC=<source path>"  & rem // (path to remote source location) 
set "_FTP_LDST=<destination path>" & rem // (path to local destination location) 
set "_REVERSE=" & rem // (set to any value to get the oldest not the newest files) 
set /A "_COUNT=1" & rem // (number of most recent or newest remote files to receive) 

rem // Check if revert flag is set, force sort order to be in decreasing age in case: 
if defined _REVERSE (set "REV=r") else (set "REV=") 

rem // Build FTP script for listing remote files sorted by age: 
> "%_FTP_LIST%" (
    rem // Check whether use name is given: 
    if defined _FTP_USER (
     rem // Avoid auto-login: 
     set "SWITCH=-n" 
     rem // Write command to login: 
     setlocal EnableDelayedExpansion 
     echo user "!_FTP_USER!" !_FTP_PASS! 
     endlocal 
    ) else (
     rem // Attempt to login anonymously: 
     set "SWITCH=-A" 
    ) 
    rem // Write command to change to the desired remote location: 
    echo cd "%_FTP_RSRC%" 
    rem // Write command to list remote files sorted by increasing age: 
    echo ls -t%REV% "%_FTP_LTMP%" 
    rem // Write command to leave the FTP host: 
    echo bye 
) 

rem /* Execute FTP script to list remote files sorted by age and write result to a 
rem temporary file, which is going to be read and parsed later: */ 
ftp -i -v %SWITCH% -s:"%_FTP_LIST%" "%_FTP_HOST%" 

rem // Build FTP script for downloading the newest remote files: 
> "%_FTP_RECV%" (
    rem // Check whether use name is given: 
    if defined _FTP_USER (
     rem // Write command to login: 
     setlocal EnableDelayedExpansion 
     echo user "!_FTP_USER!" !_FTP_PASS! 
     endlocal 
    ) 
    rem // Write command to change to the desired remote location: 
    echo cd "%_FTP_RSRC%" 
    rem // Write command to change to the desired local location: 
    echo lcd "%_FTP_LDST%" 
    rem // Reset index used to extract the listed remote files: 
    set /A "INDEX=0" 
    rem /* Read the temporary file containing the list of remote files sorted by age, 
    rem loop through them and dynamically build the download commands: */ 
    for /F usebackq^ delims^=^ eol^= %%L in ("%_FTP_LTMP%") do (
     rem // Increment index: 
     for /F %%K in ('set /A "INDEX+1"') do (
      set /A "INDEX=%%K" 
      rem /* Check whether index already reached given count of remote files and 
      rem if not, write command to download a single file: */ 
      if %%K LEQ %_COUNT% echo get "%%L" 
     ) 
    ) 
    rem // Write command to leave the FTP host: 
    echo bye 
) 

rem // Ensure that the local destination directory exists: 
md "%_FTP_LDST%" 2> nul 

rem // Execute FTP script to download the newest remote files: 
ftp -i -v %SWITCH% -s:"%_FTP_RECV%" "%_FTP_HOST%" 

rem // Clean up temporary files: 
del "%_FTP_LIST%" "%_FTP_RECV%" "%_FTP_LTMP%" 

endlocal 
exit /B 
+0

谢谢@aschipfl!这看起来不错。我用您的代码替换了我的代码并添加了所需的详细信息。但是,它不起作用。你能否检查它是否在你的系统上运行。 – Misscurious

+0

你的意思是“它不工作”?请详细说明。我在我的系统上检查过它,它按预期工作...... – aschipfl