FTP批处理脚本优化:实现单文件循环下载与归档
单文件循环处理的FTP脚本优化方案
针对原脚本批量操作导致的新文件误归档问题,以下两种优化方案实现下载单个PDF后立即归档,循环执行直至无文件可处理时退出。
方案一:WinSCP内置循环(高效推荐)
此方案仅建立一次FTP连接,通过WinSCP的文件掩码和脚本循环实现单文件处理,效率更高。
步骤1:创建WinSCP脚本文件
新建文本文件命名为process_files.txt,写入以下内容:
open ftp://xxxxx:xxxxxxx@xxxxxx/file/file1/ -passive=0 binary :loop :: 仅下载第一个匹配的PDF文件 get *.pdf|1 \\xxxxxxxx\xxxxxxx\xxxxxx\xxxxxxxx\ :: 下载失败(无文件)则退出循环 if errorlevel 1 goto exit_loop :: 仅移动第一个匹配的PDF文件到归档目录 mv *.pdf|1 /xxxxxx/file1/archive/ :: 回到循环继续处理下一个文件 goto loop :exit_loop close exit
步骤2:编写批处理调用脚本
新建批处理文件,写入以下内容:
@echo off set "WINSCP_PATH=C:\Program Files (x86)\WinSCP\WinSCP.com" "%WINSCP_PATH%" /ini=nul /script=process_files.txt
方案二:批处理循环调用WinSCP
此方案通过批处理捕获文件列表,逐个调用WinSCP处理,适合需要更灵活控制的场景。
@echo off setlocal enabledelayedexpansion :: 配置参数 set "WINSCP_PATH=C:\Program Files (x86)\WinSCP\WinSCP.com" set "FTP_URL=ftp://xxxxx:xxxxxxx@xxxxxx/file/file1/" set "LOCAL_DIR=\\xxxxxxxx\xxxxxxx\xxxxxx\xxxxxxxx\" set "ARCHIVE_DIR=/xxxxxx/file1/archive/" :LOOP :: 获取服务器PDF文件列表到临时文件 "%WINSCP_PATH%" /ini=nul /command ^ "open %FTP_URL% -passive=0" ^ "binary" ^ "ls *.pdf" ^ "exit" > winscp_temp.txt :: 提取第一个PDF文件名(跳过ls输出的表头和空行) set "TARGET_FILE=" for /f "skip=4 tokens=*" %%a in (winscp_temp.txt) do ( set "LINE=%%a" :: 从ls输出中拆分出文件名(适配标准FTP ls格式:日期 时间 大小 文件名) for /f "tokens=1,2,3,4,*" %%b in ("!LINE!") do set "TARGET_FILE=%%f" if not "!TARGET_FILE!"=="" goto PROCESS ) :: 无文件可处理,清理后退出 del winscp_temp.txt echo 无PDF文件可处理,脚本退出。 exit /b :PROCESS echo 正在处理文件:!TARGET_FILE! :: 下载单个文件 "%WINSCP_PATH%" /ini=nul /command ^ "open %FTP_URL% -passive=0" ^ "binary" ^ "get ""!TARGET_FILE!"" ""%LOCAL_DIR%""" ^ "exit" :: 移动单个文件到归档 "%WINSCP_PATH%" /ini=nul /command ^ "open %FTP_URL% -passive=0" ^ "mv ""!TARGET_FILE!"" ""%ARCHIVE_DIR%""" ^ "exit" :: 清理临时文件,继续循环 del winscp_temp.txt goto LOOP
关键说明
- 替换所有占位符(如FTP地址、本地/归档目录)为实际业务值
- 方案一的
|1是WinSCP文件掩码语法,限制仅匹配第一个文件,确保下载和归档的是同一文件 - 方案二需根据FTP服务器的
ls输出格式调整文件名提取逻辑,若格式特殊可修改for循环的拆分规则 - 测试时可开启
@echo on查看执行细节,排查问题
内容的提问来源于stack exchange,提问作者Matas Milasius
相关产品推荐
相关产品推荐

