我正在根据用户选择的选项创建一个批处理脚本来获取文件。唯一的问题是,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循环,但我认为这是在下载之前替换文件名中的字符的一种方法
答案 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.dat
(2>nul
会抑制出现在stderr上的file not found
等错误消息
setlocal enabledelayedexpansion
和endlocal
包含语法更改的模式,以便!var!
可用于访问变量的运行时值,而%var%
始终是指解析时值。
for/f
命令读取文件名(带括号)并依次将每一行分配给元变量%%a
。 delims=
选项可确保分配整行,忽略正常的标记过程。
然后将一系列单独的get
命令写入second.dat
,并在名称中用:
替换.
。
最后,再次添加bye
和FTP。
(我不确定first.dat
是否还需要bye
而second.bat
需要预先命令,但可能是......)
请注意,在“引号”中包含可能包含 Space , ; 等分隔符的文件名是批量约定。如果有必要,FTP会如何看待,我只能猜测。
当然,循环中的额外行
set "remote=!remote:x=y!"
如果遇到任何其他有问题的字符,可用于按x
连续替换字符序列y
。