使用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
谁能帮我复制基于时间戳或日期的文件?
使用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%
syntax和file mask with a time-constraint。
参见:
(我的WinSCP的作者)
你说*这是一个非常复杂的...... * *,这是否意味着它可以用'ftp.exe'实现? – aschipfl
@aschipfl [“批处理文件”是图灵完整语言](https://stackoverflow.com/q/11126539/850848),所以任何事情都是可能的 - 运行'ftp.exe'一次以列出远程目录 - 解析列表在一个非常复杂的批处理文件中挑选今天的文件 - 基于此,生成一个新的'ftp.exe'脚本来下载选择的文件。 –
我明白了,谢谢!所以在将来使用术语[*»不可能«*]时,我必须更加小心(https://stackoverflow.com/questions/44663446/download-only-todays-files-from-ftp-server-using- windows-batch-file/44668702#comment76313668_44663446)... – aschipfl
由于用户Martin Prikryl在comment指出的那样,是可以使用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
谢谢@aschipfl!这看起来不错。我用您的代码替换了我的代码并添加了所需的详细信息。但是,它不起作用。你能否检查它是否在你的系统上运行。 – Misscurious
你的意思是“它不工作”?请详细说明。我在我的系统上检查过它,它按预期工作...... – aschipfl
我不认为这是可能的与Windows的''ftp'工具... – aschipfl
是的,如果时间戳是文件名的一部分,这可能是可能的,但我不知道用ftp获取最后修改日期的方法。 – SomethingDark
你是什么意思*»只传输新文件«*?你想复制一定的最大年龄的文件,或者你需要一定数量的最新文件吗?后者可以很容易地使用'ftp.exe'实现... – aschipfl