【问题标题】:Downloading file from server over FTP通过 FTP 从服务器下载文件
【发布时间】:2014-08-25 16:12:48
【问题描述】:

我需要通过 ftp 将位于 server1 中名为 abc_20140221_123456 的文件夹中的文件下载到我的本地目录。问题是文件夹名称的最后六个字符不固定。例如,今天该文件夹可能称为 abc_20140221_123456,明天可能称为 abc_20140221_234567。我在编写自动化批处理脚本来做同样的事情时遇到问题。

这是我正在编写的脚本:

@echo off
setlocal
set buildDate=%DATE:~0,10%
set dateStr=%buildDate:~6,4%%buildDate:~3,2%%buildDate:~0,2%
set folderName=abc_%dateStr%_
echo open server1>>file.tmp 
echo username>>file.tmp
echo password>>file.tmp
echo prompt>> file.tmp
echo binary>>file.tmp
echo lcd E:\>>file.tmp
:: Not sure how to cd to abc_20140221_* from here
echo get filename.txt>>file.tmp
echo y>>file.tmp
echo disconnect>>file.tmp
echo bye>>file.tmp
ftp -i -s:file.tmp
pause

我知道我可以像这样使用 for 遍历目录:

for /d %%d in (' %path%/*%folderName%* ') do (
echo get filename.txt>>file.tmp
echo y>>file.tmp
)

但是“for”在 ftp 中不起作用>。

非常感谢任何帮助。谢谢。

【问题讨论】:

  • cd abc_20140221_* 是否在您的 FTP 服务器中工作?通常的方法是打开一个连接并将dir 命令记录到一个文本文件中,然后解析该文件夹名称的文本文件 - 并动态创建一个脚本以打开一个新的下载连接。
  • 我刚试过这样做,但 cd abc_20140221_* 在 ftp 提示符下不起作用。我明白你想说什么。但是有没有更简单的方法呢?
  • 不,因为 FTP 没有提供通过通配符更改文件夹的方法,因为您已经尝试过。您也许可以使用具有诸如此类额外功能的第三方 FTP 工具,但 Windows FTP 是有限的。

标签: windows batch-file ftp cmd remote-access


【解决方案1】:

我假设对于给定日期只有一个 abc_YYYYMMDD_nnnnnn 目录。

@echo off
setlocal
set buildDate=%DATE:~0,10%
set dateStr=%buildDate:~6,4%%buildDate:~3,2%%buildDate:~0,2%
set folderName=abc_%dateStr%_
set root=E:
echo open server1>file.tmp 
echo username>>file.tmp
echo password>>file.tmp
echo prompt>> file.tmp
echo binary>>file.tmp
for /D %%D in (%root%\%foldername%??????) do set target=%%D
echo lcd %target%>>file.tmp
echo get filename.txt>>file.tmp
echo y>>file.tmp
echo disconnect>>file.tmp
echo bye>>file.tmp
ftp -i -s:file.tmp
pause

我根据您的原始脚本将root 设置为E:\ - 您可以将其更改为实际的父目录。我也变了

echo open server1>>file.tmp

echo open server1>file.tmp

所以它会创建一个新的临时文件。否则,每次脚本运行时,它将继续附加到 file.tmp。如果这是您想要的,或者您每次都生成一个唯一的脚本文件名并且只是使用 file.tmp 作为占位符,请忽略该更改并像以前一样使用 >>

如果某一天有多个文件夹,我相信此脚本将使用扩展通配符时最后出现的那个。但是,我没有对此进行测试。

【讨论】: