6

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

我怎么做?

这是我到目前为止所拥有的:

open 44.44.44.444
username
password

CD /Client/ABCCompany/

get *.csv

quit
close()

谢谢。

4

4 回答 4

6

没有简单的方法来选择带有ftp.exe.

  • 如果您知道文件的文件名中有今天的时间戳,您可以使用今天的时间戳动态生成脚本。您可以使用DATE环境变量,尽管它有一些注意事项。一种更可靠(也更复杂)的方法是使用wmic os get LocalDateTime.

    请参阅如何以适合在文件/文件夹名称中使用的格式在 Windows 命令行上获取当前日期/时间?

  • 如果您可以按字母顺序确定最新文件,您可以:

    • 运行重定向到文件的ftp.exewith命令ls
    • 按字母降序对文件进行排序
    • 阅读第一行
    • ftp.exe为第二次运行生成下载脚本。
  • WinSCP可以下载最新的文件,使用命令-latest的开关:get

    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。

  • DATE使用 WinSCP,您可以比使用或更轻松地下载文件名中带有时间戳的文件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的作者)

于 2015-09-21T10:17:50.210 回答
0

您很可能必须分两部分进行转移。第一个发出 DIR 命令,该命令应将最近的文件作为最后一个文件。从 DIR 输出中解析出最后一个文件名后,将该文件名用于后续 GET。

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

于 2014-03-06T13:57:12.000 回答
0

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

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

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

我们的备份程序每天早上 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%"
于 2018-08-07T09:20:42.830 回答
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()
于 2015-12-18T10:41:11.890 回答