我必须通过FTP获取和删除多个文件,所以我写了这个脚本:
open ftp.myftpserver.org
user
pass
cd folder
lcd E:\localdir
mget *
mdel *
bye
这可行,但不安全,因为folder
正在从其他来源提供,mdel *
步骤可能会删除同时上传的文件。
我想解决方案可能是将文件远程移动到另一个文件夹,在流程开始时构建文件列表,但我不知道如何制作它。
可能吗?
答案 0 :(得分:2)
FTR我遵循了很好的提示,我成功地做了一些工作,也许不优雅但是有效:
获取文件列表的第一步:
getfilelist.bat
open ftp.myserver.it myuser pass1234 cd ftpfolder prompt n lcd E:\localdir ls *.??? filelist.txt bye
下载并删除上述文件的第二步
movefiles.bat
@echo off setlocal enableextensions setlocal enabledelayedexpansion echo open ftp.myserver.it>>myscript echo user myuser pass1234>>myscript echo cd ftpfolder>>myscript echo prompt n>>myscript echo ascii>>myscript echo lcd E:\downloaddir>>myscript for /F "usebackq tokens=1,2* delims=," %%G IN ("E:\localdir\filelist.txt") DO ECHO rename %%G %%G_TMP>>myscript echo mget *_TMP>>myscript echo mdelete *_TMP>>myscript echo bye>>myscript ftp -n -s:myscript del filelist.txt del myscript e: cd E:\downloaddir ren *.???_TMP *.???
用于调用上述步骤的bat文件:
E: cd E:\localdir ftp -i -s:E:\localdir\getfilelist.bat E:\localdir\movefiles.bat
希望有所帮助
答案 1 :(得分:0)
不知道你是否可以使用ftp客户端的脚本来做到这一点。
最好使用您选择的语言作为程序或scipt使用FTP库,这样您就可以更好地控制FTP操作。例如perl与Net :: ftp,java等。
然后您可以实现以下算法:
remote cd to required folder
localcd to required folder
list current files in remote folder
for each file in list that matchs required pattern
get file
if get ok then
delete file
else
log error,exit or whatever error handling you want
endif
endfor
还需要确保您没有尝试获取正在编写的文件,具体取决于使用文件锁可能为您处理的o / s,但您需要确保文件在两个阶段的过程中写入远程目录。首先,临时目录或文件名与您要检查的文件模式不匹配,然后重命名或移动到您将检测到的正确位置和名称。
答案 2 :(得分:0)
必须在每次循环迭代时动态创建文件获取脚本以获取下一个文件。
cd to working dir
Run FTP with script to:
cd to remote folder
list files matching required pattern and store in local file
(e.g: ls files_*.txt filelist.txt)
for each file in file list created above (e.g. use 'for /f ...' command to loop through filelist.txt)
create temp ftp script to:
cd to remote dir
lcd to local dir
get file
del file
run FTP with temp script
endfor
这个网站有一个做similer的例子(注意脚本如图所示,注释提供所需更正的详细信息)。
http://www.computing.net/answers/programming/batch-ftp-script-list-rename-get-delete/25728.html
答案 3 :(得分:0)
我有类似的问题。看起来很多人在这里挣扎; - )
我必须下载多个文件并在远程服务器上成功下载后删除它们以避免双重处理。在执行import Backbone from 'backbone';
require('backbone.stickit/backbone.stickit');
....
const Backbone2 = Backbone;
export {Backbone2};
远程系统时添加更多文件的可能性非常小。因此,mget
可能会删除未传输的文件。
我的方法是不使用除FTP命令以外的任何东西。我们走了:
mdelete
我一眼就将所有文件移动到远程服务器上的额外目录中。应该非常快,因为这在当地发生。将文件转移到传输目录后,我会执行真正的cd <dir on remote server>
mkdir Transfer
mv *.* Transfer
mget Transfer\*.*
del Transfer\*.*
rmdir Transfer
下载。这可能需要更长时间,同时可以在远程服务器主目录上安全地上载更多文件。
下载完成后,我删除了传输目录中的所有文件并删除了dir本身。