在使用bat脚本通过FTP命令上传文件夹时,需要结合FTP的批处理模式实现递归上传,因为FTP协议本身不支持直接上传整个文件夹,需通过遍历文件夹结构并逐个上传文件来实现,以下是详细的操作步骤和代码示例,涵盖环境准备、脚本编写及常见问题处理。

环境准备与FTP服务器配置
- 确保FTP服务可用:目标服务器需启用FTP服务并配置正确的用户权限,确保上传目录有写入权限。
- 本地安装FTP客户端:Windows系统自带ftp命令,无需额外安装,但需确认
ftp.exe在系统PATH中(通常位于C:\Windows\System32)。 - 测试FTP连接:手动通过命令行
ftp ftp服务器地址验证用户名、密码及登录是否正常。
批处理脚本核心逻辑
脚本需实现以下功能:
- 递归遍历本地文件夹及其子文件夹
- 逐个上传文件并保持目录结构
- 处理上传失败、网络中断等异常情况
示例脚本代码(upload_folder.bat)
@echo off
setlocal enabledelayedexpansion
:: 配置FTP参数
set ftp_server=ftp.example.com
set ftp_user=username
set ftp_pass=password
set local_folder=C:\local\path\to\folder
set remote_folder=/remote/upload/path
:: 临时FTP脚本文件
set ftp_script=ftp_upload.txt
:: 创建FTP命令脚本
(
echo open %ftp_server%
echo user %ftp_user% %ftp_pass%
echo binary
echo lcd "%local_folder%"
echo cd "%remote_folder%"
echo prompt off
:: 遍历本地文件夹并生成mput命令
for /r "%local_folder%" %%f in (*) do (
set "relative_path=%%f"
set "relative_path=!relative_path:%local_folder%=!"
set "remote_file=!relative_path:\=/!"
echo mput "%%f" "!remote_file!"
)
echo bye
) > %ftp_script%
:: 执行FTP上传
ftp -s:%ftp_script%
:: 清理临时文件
del %ftp_script%
echo Upload completed.
pause
代码解析
- 参数配置:修改
ftp_server、ftp_user等变量为实际值。 - 递归遍历:
for /r命令遍历本地文件夹所有文件,!relative_path:变量替换实现相对路径计算。 - FTP命令生成:
binary:确保二进制文件(如图片、压缩包)传输正确。prompt off:禁用覆盖确认提示,实现批量上传。mput:上传文件并保留远程路径结构(需远程目录已存在)。
高级优化与注意事项
- 目录结构自动创建:若远程目录不存在,需在脚本中添加
mkdir命令,修改FTP脚本部分为:for /d %%d in ("%local_folder%\*") do ( set "rel_dir=%%d" set "rel_dir=!rel_dir:%local_folder%=!" set "remote_dir=!rel_dir:\=/!" if not exist "%%d\" ( echo mkdir "!remote_dir!" ) ) - 错误处理:通过
ftp命令的返回值判断上传是否成功,添加以下代码到脚本末尾:if %errorlevel% neq 0 ( echo Error: Upload failed. Check logs. exit /b 1 ) - 大文件分块上传:若文件较大,可使用
hash命令设置传输校验(如hash 1024)。
常见问题与解决方案
上传后文件权限异常
问题:上传后的文件权限与本地不一致(如只读)。
解决:
- 服务器端需配置FTP服务自动调整权限(如vsftpd的
local_umask=022)。 - 或通过
site chmod命令在FTP脚本中添加权限修改(需服务器支持):echo site chmod 755 "filename" >> %ftp_script%
中文文件名乱码
问题:文件名包含中文时显示为乱码。
解决:
- 本端系统确保使用UTF-8编码(保存脚本时选择UTF-8 without BOM)。
- 服务器端FTP服务需支持UTF-8(如FileZilla Server的
ForceUTF8选项)。 - 或使用
quote set charset utf-8命令(部分FTP服务器支持)。
相关问答FAQs
Q1: 如何在脚本中显示上传进度?
A1: FTP命令本身不直接支持进度显示,可通过第三方工具(如winscp.com)结合脚本实现,示例:

winscp.com /command "open ftp://user:pass@ftp.example.com" "option batch continue" "option confirm off" "put -filemask=* -noupload -transfer=binary %local_folder% %remote_folder%" "exit"
并在日志中记录传输状态。
Q2: 如何实现断点续传?
A2: 使用FTP的reget命令(需服务器支持),修改脚本中的上传部分为:
for %%f in ("%local_folder%\*") do (
echo size "%%~nxf" > temp_size.txt
ftp -n -s:ftp_script.txt
echo reget "%%f" "%%~nxf"
)
通过比较本地与远程文件大小判断是否续传。

