【问题标题】:Windows batch script to download yesterday files用于下载昨天文件的 Windows 批处理脚本
【发布时间】:2011-11-16 18:39:45
【问题描述】:

我正在编写一个脚本,使用ftp.exe 从 FTP 服务器下载文件,它起初可以工作。但我写的版本只适用于一个文件和当前日期。我的脚本如下:

echo user>>ftp.txt
echo password>>ftp.txt
set prefix=%date:~0,10%
set "name=%prefix%.txt"
echo get %name% >> ftp.txt
echo bye >> ftp.txt
ftp -s:ftp.txt ftpserver.com
del ftp.txt

但是现在有不止一个文件名为aa-bb-2011-09-13.0.logaa-bb-2011-09-13.1.log, aa-bb-2011-09-13.10.log。最后一个数字是序列号,可以是0123...

如何通过批处理脚本下载这些文件?如何修改我的脚本以下载多个文件(数量未知)昨天的文件名模式?

【问题讨论】:

    标签: windows command-line batch-file ftp


    【解决方案1】:

    使用 Windows 批处理文件和内置 FTP 客户端 (ftp.exe) 实现是一项相当复杂的任务。

    使用 PowerShell 会更容易。


    使用功能更强大的 FTP 客户端甚至更容易,例如最新版本的WinSCP FTP client

    如果您想根据文件名中的模式下载文件,可以这样做:

    winscp.com /ini=nul /log=yesterday.log /command ^
        "open ftp://username:password@ftp.example.com/" ^
        "get /remote/path/*%%TIMESTAMP-1D#yyyy-mm-dd%%* C:\local\path\" ^
        "exit"
    

    这使用%TIMESTAMP% syntax


    如果要根据文件修改时间下载,请使用file mask with a time-constraint

    winscp.com /ini=nul /log=yesterday.log /command ^
        "open ftp://username:password@ftp.example.com/" ^
        "get /remote/path/*>=yesterday<today C:\local\path\" ^
        "exit"
    

    WinSCP 5.15 及更高版本支持&gt;=yesterday&lt;today syntax

    在旧版本的 WinSCP 中,您可以再次使用%TIMESTAMP% syntax,尤其是&gt;=%%TIMESTAMP-1D#yyyy-mm-dd%%&lt;%%TIMESTAMP#yyyy-mm-dd%%,而不是&gt;=yesterday&lt;today

    (我是 WinSCP 的作者)

    【讨论】:

      【解决方案2】:

      这是一个示例 FTP 脚本,它几乎可以满足您的需求,但它使用的是第 3 方客户端,而不是 Windows 随附的免费客户端:http://kb.robo-ftp.com/script_library/show/45

      也许你可以转换它。

      【讨论】:

        【解决方案3】:

        在下载多个文件方面,使用mget 而不是get。前者允许您指定通配符来获取而不是特定文件。

        您只需要使用通配符模式构造“名称”,并确保您的脚本中在mget 之前有一个prompt,否则它将要求对每个文件进行确认。

        这是未经测试的,但它可能就像改变一样简单:

        echo get %name% >> ftp.txt
        

        类似于:

        echo prompt>>ftp.txt
        echo mget *%prefix%*>>ftp.txt
        

        在获取昨天的日期方面,您可以使用以下脚本。与您将在其中执行的操作(例如 bash)相比,它相当复杂,但它确实有效。

        @setlocal enableextensions enabledelayedexpansion
        @echo off
        
        rem Get the date from WMI (on one line).
        
        for /f "skip=2 tokens=2-7 delims=," %%A in ('wmic 
                path win32_localtime get day^,month^,year^ /format:csv') do (
            set /a "yest_yyyy = %%C"
            set /a "yest_mm = %%B"
            set /a "yest_dd = %%A"
        )
        
        rem Not the first of the month, just decrement day.
        
        if not %yest_dd%==1 (
            set /a yest_dd = yest_dd - 1
            goto done
        )
        
        rem Jan 1, set to Dec 31 previous year.
        
        if %yest_mm%==1 (
            set /a "yest_dd = 31"
            set /a "yest_mm = 12"
            set /a "yest_yyyy = yest_yyyy - 1"
            goto :done
        )
        
        rem Any other day, decrement month.
        
        set /a "yest_mm = yest_mm - 1"
        
        rem Need to find last day, default to 31.
        
        set dim=31
        
        rem Apr/Jun/Sep/Nov all have 30 days. Feb gets special handling.
        
        if %yest_mm%==4 set dim=30
        if %yest_mm%==6 set dim=30
        if %yest_mm%==9 set dim=30
        if %yest_mm%==11 set dim=30
        if not %yest_mm%==2 goto :got_dim
        
        rem Default Feb to 28 then use rules to override.
        
        set dim=28
        
        set /a "divid=yest_yyyy%%400"
        if "%divid%"=="0" goto daysinmonth_29days
        set /a "divid=yest_yyyy%%100"
        if "%divid%"=="0" goto :done
        set /a "divid=yest_yyyy%%4"
        if not "%divid%"=="0" goto :done
        
        rem Adjust to 29 days.
        
        :daysinmonth_29days
        
        set dim=29
        
        :done
        
        rem Pad out and return value.
        
        if %yest_mm% lss 10 set yest_mm=0%yest_mm%
        if %yest_dd% lss 10 set yest_dd=0%yest_dd%
        
        set yesterday=%yest_yyyy%-%yest_mm%-%yest_dd%
        
        endlocal && set yesterday=%yesterday%
        

        它将yesterday 环境变量设置为YYYY-MM-DD 格式,以便您可以在当前脚本中使用它。只需调用call yesterday.cmd,然后使用环境变量。

        【讨论】:

        • @huangli,也许有帮助,但cmd 脚本很少清晰:-)
        • 给我一个挑战更好:-)
        • 我用的脚本是这样的:1.call昨天.cmd 2.echo %yesterday%,但是报错“Invalid XSL format (or) file name. ( was unexpected at this time.”弹出。
        • XSL?是在您调用它时发生的,还是在您回应时发生的?
        • 没关系,这可能是 Win7 中的一个已知问题:social.technet.microsoft.com/Forums/en/w7itprogeneral/thread/… - 你需要先让 wmic 工作。还有ninjamonki.blogspot.com/2011/07/…
        猜你喜欢
        • 2013-05-16
        • 1970-01-01
        • 2011-02-21
        • 1970-01-01
        • 2019-06-01
        • 1970-01-01
        • 2011-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多