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



我有一个批处理文件,可以从我的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,您可以比使用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的作者)

您很可能需要分两部分进行传输。第一个发出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%"

最新更新