我有一个批处理文件,从我的Web服务器FTPs CSV文件。我只需要下载最新的CSV文件。
我怎么做?
这是我到目前为止:
open 44.44.44.444
username
password
CD /Client/ABCCompany/
get *.csv
quit
close()
谢谢。
使用ftp.exe
选择最新文件并不容易。
DATE
环境变量,尽管它有其警告。更可靠(和复杂)的方法是使用wmic os get LocalDateTime
。
见How do I get current datetime on the Windows command line, in a suitable format for using in a filename?ftp.exe
命令运行ls
重定向到文件
按字母顺序按降序排序文件
读第一行
生成第二个ftp.exe
运行的下载脚本。-latest
的get
command开关下载最新的文件:
winscp.com /command ^
"open ftp://username:[email protected]/" ^
"cd /remote/path" ^
"get -latest *.csv" ^
"exit"
另见downloading the most recent file with WinSCP指南。winscp.com /command ^
"open ftp://username:[email protected]/" ^
"cd /remote/path" ^
"get *.csv>=1D" ^
"exit"
或者从某个时间点创建的文件,例如要下载自午夜以来创建的文件,请使用today
keyword:
winscp.com /command ^
"open ftp://username:[email protected]/" ^
"cd /remote/path" ^
"get *.csv>=today" ^
"exit"
today
关键字仅受WinSCP 5.15和更新版本支持。在旧版本中,使用%TIMESTAMP%
syntax,特别是%%TIMESTAMP#yyyy-mm-dd%%
,而不是today
。DATE
或wmic os get LocalDateTime
(如上所示)更轻松地下载文件名时间戳的文件。再次使用%TIMESTAMP%
语法:
winscp.com /command ^
"open ftp://username:[email protected]/" ^
"cd /remote/path" ^
"get %%TIMESTAMP#yyyy-mm-dd%%.txt" ^
"exit"
(我是WinSCP的作者)您很可能需要分两部分进行转移。第一个发出DIR命令,它应该将最新的文件作为最后一个。解析出DIR输出中的最后一个文件名后,使用该文件名进行后续GET。
我在C#中做了类似的事情。
最简单的方法是将其拆分为两个单独的连接,并在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()
我一再需要从我们的生产环境下载备份文件,以便在我们的开发环境中安装。
在我们的例子中,我想自动下载的文件的文件名具有在其中指定的日期:backup_2018_08_03_020003_1048387.bak
所以我们可以在命令行ftp session中使用mget *2018_08_03*
来获取文件。
我们的备份程序每天早上01.00运行,因此我们每天都有备份我们可以获取。
当然,根据备份文件时间戳获取最新备份文件的脚本会更漂亮,更好,以防最新备份出现问题或备份文件命名格式发生变化。该脚本只是一个脚本,用于获取内部开发目的的备份,因此如果它中断,它不是什么大问题。我稍后会研究这个问题,检查一下是否可以制作更清洁的解决方案。
我制作了一个批处理脚本,它只是用普通的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%"