【问题标题】:Batch file to download the latest file from FTP server用于从 FTP 服务器下载最新文件的批处理文件
【发布时间】:2012-08-15 09:35:39
【问题描述】:

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

我该怎么做?

这是我目前所拥有的:

open 44.44.44.444
username
password

CD /Client/ABCCompany/

get *.csv

quit
close()

谢谢。

【问题讨论】:

  • 你怎么知道哪个是最新的?基于文件格式或文件创建日期?
  • 我不熟悉 FTP 命令的脚本,这是我更新的,我得到一个无效命令错误:*FOR /F %%I IN ('DIR *.csv /B /O:-D') 复制 %%I c:*
  • /B /O 是做什么的?我没有在其他 Forfile 帖子中看到这些内容。
  • @GregHewgill 感谢您使用 Batch 脚本访问页面。我在理解密钥以及如何使用它们时遇到问题。既然是FTP,就没有Copy命令吧?

标签: batch-file ftp


【解决方案1】:

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

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

    见How do I get current date/time on the Windows command line in a suitable format for usage in a file/folder name?

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

    • 运行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"
    

    对于 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 的作者)

【讨论】:

    【解决方案2】:

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

    在我们的例子中,我想要自动下载的文件的文件名中指定了日期: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%"
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2017-05-31
          • 2015-07-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-24
          相关资源
          最近更新 更多