使用Windowsbatch file从FTP服务器下载今天的文件

我正尝试将XML文件从FTP位置复制到应用程序服务器 – 但不是所有文件。 新文件在ftp位置每隔半小时存档一次。 我只需要传输基于时间戳和date的新文件。

我正在使用下面的2个文件从FTP位置复制所有文件。

batch file

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

文本文件(ftp_commands.txt):

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

任何人都可以请帮我复制基于时间戳或date的文件?

Solutions Collecting From Web of "使用Windowsbatch file从FTP服务器下载今天的文件"

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

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


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

例如, WinSCP FTP客户端支持时间限制。

使用WinSCP,下载今天文件的批处理文件就像下面这样简单:

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

这使用%TIMESTAMP%语法和带时间约束的文件掩码 。

也可以看看:

  • 将Windows FTP脚本转换为WinSCP脚本的指南 ;
  • 用WinSCP下载最新的文件 。

(我是WinSCP的作者)

正如用户Martin Prikryl在评论中指出的那样,可以使用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