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

时间:2012-08-20 00:50:28

标签: batch-file ftp

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

我该怎么做?

这是我到目前为止所做的:

open 44.44.44.444
username
password

CD /Client/ABCCompany/

get *.csv

quit
close()

感谢。

4 个答案:

答案 0 :(得分: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可以使用get command-latest开关下载最新文件:

    winscp.com /command ^
        "open ftp://username:password@ftp.example.com/" ^
        "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:password@ftp.example.com/" ^
        "cd /remote/path" ^
        "get *.csv>=1D" ^
        "exit"
    

    或从某个时间点创建的文件,例如要下载自午夜以来创建的文件,请使用today keyword

    winscp.com /command ^
        "open ftp://username:password@ftp.example.com/" ^
        "cd /remote/path" ^
        "get *.csv>=today" ^
        "exit"
    

    WinSCP 5.15及更新版本支持today关键字。在旧版本中,请使用%TIMESTAMP% syntax,而不是%%TIMESTAMP#yyyy-mm-dd%%,而不是today

  • 使用WinSCP,您可以比使用DATEwmic 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的作者)

答案 1 :(得分:0)

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

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

答案 2 :(得分: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()

答案 3 :(得分:0)

我反复需要从生产环境中下载备份文件,以便在开发环境中进行安装。

在本例中,我要为其自动下载文件的文件名中指定了日期:backup_2018_08_03_020003_1048387.bak

因此我们可以在命令行ftp会话中使用mget *2018_08_03*来获取文件。

我们的备份过程每天早上01:00 AM运行,因此我们每天都有一个可以提取的备份。

当然,有一个脚本可以根据备份文件的时间戳来获取最新的备份文件,这是更好,更好的选择,以防万一最新备份或备份文件命名格式出了问题。该脚本只是为了内部开发目的而获取备份的脚本,因此,如果损坏,则没什么大不了的。稍后,我将进行调查,并检查是否可以提供更清洁的解决方案。

我制作了一个批处理脚本,该脚本只使用普通的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%"