使用windows

时间:2017-10-17 02:41:05

标签: batch-file ftp

我正在根据用户选择的选项创建一个批处理脚本来获取文件。唯一的问题是,ftp服务器中的文件有一个冒号,根据我的研究,windows不接受":"冒号。

下载前是否可以替换该字符?

以下是我的代码示例。

Echo open sample.net>first.dat
Echo user>>first.dat
Echo password>>first.dat
Echo ascii>>first.dat
Echo cd directory>>first.dat
Echo lcd folder>>first.dat
Echo get sample-text-10-16-2017_16:36:00:340033.txt>>first.dat
Echo bye>>first.dat
ftp -v -i -s:first.dat
del first.dat

正如您所看到的,我首先获取文件夹中文件名的列表,供用户输入文件名。我刚刚为示例

编写了一个特定的文件名

我仍然不熟悉批处理中的for循环,但我认为这是在下载之前替换文件名中的字符的一种方法

1 个答案:

答案 0 :(得分:2)

[未经审讯]

get remotefilename localfilename

显然是有效的,因此将有效的Windows文件名作为第二个参数放置应该d / l到指定的文件。

[附录 - 也未经过试验]

(在Echo lcd文件夹>> first.dat之后)

echo mls remotefilesrequired awindowlistfilename>>first.dat
rem this should log in and create awindowslistfilename 
rem containing the remote filelist
ftp -v -i -s:first.dat
del second.dat 2>nul
setlocal enabledelayedexpansion
for /f "delims=" %%a in (awindowslistfilename) do (
 set "remote=%%a"
 echo get !remote! !remote::=.!>>second.dat
)
endlocal
Echo bye>>second.dat
ftp -v -i -s:second.dat
del first.dat
del second.dat

由于我不知道mls的返回格式,我假设它是一个简单的文件列表,一个到一行。

此代码首先执行ftp登录palaver和mls命令,在本地创建awindowslistfile

然后删除second.dat2>nul会抑制出现在stderr上的file not found等错误消息

setlocal enabledelayedexpansionendlocal包含语法更改的模式,以便!var!可用于访问变量的运行时值,而%var% 始终是指解析时值。

for/f命令读取文件名(带括号)并依次将每一行分配给元变量%%adelims=选项可确保分配整行,忽略正常的标记过程。

然后将一系列单独的get命令写入second.dat,并在名称中用:替换.

最后,再次添加bye和FTP。

(我不确定first.dat是否还需要byesecond.bat需要预先命令,但可能是......)

请注意,在“引号”中包含可能包含 Space ; 等分隔符的文件名是批量约定。如果有必要,FTP会如何看待,我只能猜测。

当然,循环中的额外行

 set "remote=!remote:x=y!"
如果遇到任何其他有问题的字符,

可用于按x连续替换字符序列y