批处理文件从FTP服务器下载最新文件

问题描述 投票:5回答:4

我有一个批处理文件,从我的Web服务器FTPs CSV文件。我只需要下载最新的CSV文件。

我怎么做?

这是我到目前为止:

open 44.44.44.444
username
password

CD /Client/ABCCompany/

get *.csv

quit
close()

谢谢。

batch-file ftp
4个回答
5
投票

使用ftp.exe选择最新文件并不容易。

  • 如果您知道该文件的文件名中包含今天的时间戳,则可以使用今天的时间戳动态生成脚本。您可以使用DATE环境变量,尽管它有其警告。更可靠(和复杂)的方法是使用wmic os get LocalDateTime。 见How do I get current datetime on the Windows command line, in a suitable format for using in a filename?
  • 如果您可以按字母顺序确定最新文件,则可以: 使用ftp.exe命令运行ls重定向到文件 按字母顺序按降序排序文件 读第一行 生成第二个ftp.exe运行的下载脚本。
  • WinSCP可以使用-latestget command开关下载最新的文件: winscp.com /command ^ "open ftp://username:[email protected]/" ^ "cd /remote/path" ^ "get -latest *.csv" ^ "exit" 另见downloading the most recent file with WinSCP指南。
  • WinSCP还可以下载创建的文件within some interval,例如过去24小时(1天): winscp.com /command ^ "open ftp://username:[email protected]/" ^ "cd /remote/path" ^ "get *.csv>=1D" ^ "exit" 或者从某个时间点创建的文件,例如要下载自午夜以来创建的文件,请使用today keywordwinscp.com /command ^ "open ftp://username:[email protected]/" ^ "cd /remote/path" ^ "get *.csv>=today" ^ "exit" today关键字仅受WinSCP 5.15和更新版本支持。在旧版本中,使用%TIMESTAMP% syntax,特别是%%TIMESTAMP#yyyy-mm-dd%%,而不是today
  • 使用WinSCP,您可以比使用DATEwmic os get LocalDateTime(如上所示)更轻松地下载文件名时间戳的文件。再次使用%TIMESTAMP%语法: winscp.com /command ^ "open ftp://username:[email protected]/" ^ "cd /remote/path" ^ "get %%TIMESTAMP#yyyy-mm-dd%%.txt" ^ "exit" (我是WinSCP的作者)

0
投票

您很可能需要分两部分进行转移。第一个发出DIR命令,它应该将最新的文件作为最后一个。解析出DIR输出中的最后一个文件名后,使用该文件名进行后续GET。

我在C#中做了类似的事情。


0
投票

最简单的方法是将其拆分为两个单独的连接,并在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()

0
投票

我一再需要从我们的生产环境下载备份文件,以便在我们的开发环境中安装。

在我们的例子中,我想自动下载的文件的文件名具有在其中指定的日期:backup_2018_08_03_020003_1048387.bak

所以我们可以在命令行ftp session中使用mget *2018_08_03*来获取文件。

我们的备份程序每天早上01.00运行,因此我们每天都有备份我们可以获取。

当然,根据备份文件时间戳获取最新备份文件的脚本会更漂亮,更好,以防最新备份出现问题或备份文件命名格式发生变化。该脚本只是一个脚本,用于获取内部开发目的的备份,因此如果它中断,它不是什么大问题。我稍后会研究这个问题,检查一下是否可以制作更清洁的解决方案。

我制作了一个批处理脚本,它只是用普通的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%"
© www.soinside.com 2019 - 2024. All rights reserved.