Windows批处理脚本下载昨天的文件

问题描述 投票:2回答:3

我正在编写一个使用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.logaa-bb-2011-09-13.10.log的文件。最后一个数字是一个序列号,它可能是0123 ......

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

windows command-line batch-file ftp
3个回答
3
投票

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

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

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

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然后使用环境变量。


2
投票

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

使用PowerShell会更容易。


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

如果要根据文件名中的模式下载文件,则会执行以下操作:

winscp.com /ini=nul /log=yesterday.log /command ^
    "open ftp://username:[email protected]/" ^
    "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:[email protected]/" ^
    "get /remote/path/*>=yesterday<today C:\local\path\" ^
    "exit"

>=yesterday<today syntax由WinSCP 5.15及更新版本支持。

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

(我是WinSCP的作者)


0
投票

这是一个示例FTP脚本,几乎完全符合您的需要,但它使用第三方客户端而不是Windows免费提供的客户端:http://kb.robo-ftp.com/script_library/show/45

也许你可以转换它。

© www.soinside.com 2019 - 2024. All rights reserved.