我有一个批处理文件,可以从我的web服务器中FTP CSV文件。我只需要下载最新的CSV文件。
我该怎么做?
这就是我目前所拥有的:
open 44.44.44.444
username
password
CD /Client/ABCCompany/
get *.csv
quit
close()
谢谢。
用ftp.exe
选择最新的文件没有简单的方法。
-
如果您知道文件的文件名中有今天的时间戳,则可以使用今天的时间标记动态生成脚本。您可以使用
DATE
环境变量,尽管它有一些注意事项。一种更可靠(也更复杂)的方法是使用wmic os get LocalDateTime
。请参阅如何在Windows命令行中以合适的格式获取当前日期/时间,以便在文件/文件夹名称中使用?
-
如果你能按字母顺序确定最新的文件,你可以:
- 使用重定向到文件的
ls
命令运行ftp.exe
- 按字母表降序对文件进行排序
- 读第一行
- 生成第二次运行CCD_ 6的下载脚本
- 使用重定向到文件的
-
WinSCP可以使用
get
命令的-latest
开关下载最新文件:winscp.com /command ^ "open ftp://username:password@ftp.example.com/" ^ "cd /remote/path" ^ "get -latest *.csv" ^ "exit"
另请参阅使用WinSCP下载最新文件的指南。
-
WinSCP还可以下载在某个时间间隔内创建的文件,例如最近24小时(1天):
winscp.com /command ^ "open ftp://username:password@ftp.example.com/" ^ "cd /remote/path" ^ "get *.csv>=1D" ^ "exit"
或从某个时间点创建的文件,例如下载从午夜创建的文件时,请使用
today
关键字:winscp.com /command ^ "open ftp://username:password@ftp.example.com/" ^ "cd /remote/path" ^ "get *.csv>=today" ^ "exit"
对于
today
关键字,请确保您有最新版本的WinSCP。 -
使用WinSCP,您可以比使用
DATE
或wmic os get LocalDateTime
更容易地实现文件名中带有时间戳的文件的下载(如上所示)。使用%TIMESTAMP%
语法:winscp.com /command ^ "open ftp://username:password@ftp.example.com/" ^ "cd /remote/path" ^ "get %%TIMESTAMP#yyyy-mm-dd%%.txt" ^ "exit"
(我是WinSCP的作者)
您很可能需要分两部分进行传输。第一个发出DIR命令,该命令应将最近的文件作为最后一个文件。从DIR输出中解析出最后一个文件名后,将该文件名用于后续的GET。
我在C#中做了类似的事情。
最简单的方法是将其拆分为两个独立的连接,并在FTP位置有一个文本文件,其中包含最新文件的名称。
open 44.44.44.444
username
password
CD /Client/ABCCompany/
get latestfile.txt
quit
close()
latestfile.txt将包含您需要下载的最新文件的名称。第二个脚本将读取latestfile.txt中的文本,并仅提取该文件。
for /F "tokens=*" %%A in (latestfile.txt) do [SET FILE = %%A]
您必须将上面的行添加到正在调用辅助FTP脚本的批处理文件中。
open 44.44.44.444
username
password
CD /Client/ABCCompany/
get %FILE%
quit
close()
我反复需要从我们的生产环境下载一个备份文件,以便在我们的开发环境中安装。
在我们的情况下,我想自动下载的文件的文件名中指定了日期:backup_2018_08_03_020003_1048387.bak
因此,我们可以在命令行ftp会话中使用mget *2018_08_03*
来获取该文件。
我们的备份程序每天早上1点运行,所以我们每天都有一个备份可以提取。
当然,如果有一个基于备份文件时间戳提取最新备份文件的脚本会更漂亮、更好,以防最新备份出现问题或备份文件命名格式更改。该脚本只是一个用于内部开发的获取备份的脚本,所以如果它坏了也没什么大不了的。我稍后会对此进行研究,并检查是否可以制作更清洁的解决方案。
我制作了一个批处理脚本,只需要使用普通的ftp命令提示符脚本来获取今天的备份文件。
正确设置今天日期的格式很重要。它必须与文件名中日期的格式正确匹配。
如果你想使用脚本,你应该用你自己的信息替换变量。您还应该对运行它的目录具有写访问权限。
这是我制作的脚本:
@Echo Off
Set _FTPServerName=xxx.xxx.xx.xxx
Set _UserName=Username
Set _Password=Password
Set _LocalFolder=C:Temp
Set _RemoteFolder="/path/"
Set _Filename=*%date:~-4,4%_%date:~-7,2%_%date:~-10,2%*
Set _ScriptFile=ftptempscript
:: Create script
>"%_ScriptFile%" Echo open %_FTPServerName%
>>"%_ScriptFile%" Echo %_UserName%
>>"%_ScriptFile%" Echo %_Password%
>>"%_ScriptFile%" Echo lcd %_LocalFolder%
>>"%_ScriptFile%" Echo cd %_RemoteFolder%
>>"%_ScriptFile%" Echo binary
>>"%_ScriptFile%" Echo mget -i %_Filename%
>>"%_ScriptFile%" Echo quit
:: Run script
ftp -s:"%_ScriptFile%"
del "%_ScriptFile%"