我正在编写一个使用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.log
,aa-bb-2011-09-13.1.log
,aa-bb-2011-09-13.10.log
的文件。最后一个数字是一个序列号,它可能是0
,1
,2
,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
然后使用环境变量。
使用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"
如果要根据文件修改时间下载,请使用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的作者)
这是一个示例FTP脚本,几乎完全符合您的需要,但它使用第三方客户端而不是Windows免费提供的客户端:http://kb.robo-ftp.com/script_library/show/45
也许你可以转换它。