批处理脚本开发求助:遍历近5天日期文件夹同步至FTP
解决方案:同步近5天日期命名的文件夹到SFTP
问题分析
原脚本直接同步整个目录,未筛选一级目录中的日期文件夹。我们需要遍历Z:\test\folder1下的一级文件夹,判断其名称是否在近5天日期范围内,再对符合条件的文件夹单独同步。
修改后的脚本
@echo off setlocal enabledelayedexpansion REM 获取当前日期(YYYY-MM-DD格式) set "TIMESTAMP=%date:~10,4%-%date:~7,2%-%date:~4,2%" REM 获取5天前的日期(YYYY-MM-DD格式) set day=-5 echo >"%temp%\%~n0.vbs" s=DateAdd("d",%day%,now) echo>>"%temp%\%~n0.vbs" WScript.Echo year(s)^&"-"^&right(100+month(s),2)^&"-"^&right(100+day(s),2) for /f %%a in ('cscript /nologo "%temp%\%~n0.vbs"') do set "pre_date=%%a" del "%temp%\%~n0.vbs" REM 定义本地根目录和SFTP目标根目录 set "LOCAL_ROOT=Z:\test\folder1" set "SFTP_ROOT=/mnt/logs/test" REM 遍历本地根目录下的一级文件夹 for /d %%d in ("%LOCAL_ROOT%\*") do ( set "FOLDER_NAME=%%~nxd" REM 判断文件夹名称是否为YYYY-MM-DD格式,且日期在pre_date到TIMESTAMP之间 echo !FOLDER_NAME! | findstr /r "^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$" >nul if not errorlevel 1 ( if "!FOLDER_NAME!" geq "!pre_date!" if "!FOLDER_NAME!" leq "!TIMESTAMP!" ( echo 正在同步文件夹: !FOLDER_NAME! REM 同步当前日期文件夹到SFTP对应路径 "C:\Program Files (x86)\WinSCP\WinSCP.com" ^ /log="C:\Users\testuser\Desktop\batch\WinSCP.log" /ini=nul ^ /command ^ "open sftp://team:O%%l%%24og3@187.121.11.25/ -hostkey=""ssh-ed25519 256 f0pa/Fxg81I0Wjo=""" ^ "synchronize remote ""%%d"" ""%SFTP_ROOT%/!FOLDER_NAME!""" ^ "exit" set "WINSCP_RESULT=!ERRORLEVEL!" if !WINSCP_RESULT! equ 0 ( echo 同步成功: !FOLDER_NAME! ) else ( echo 同步失败: !FOLDER_NAME!,错误码: !WINSCP_RESULT! ) ) ) ) PAUSE exit /b %WINSCP_RESULT%
关键修改点说明
- 启用延迟变量扩展:添加
setlocal enabledelayedexpansion,确保循环内的变量(如FOLDER_NAME)能正确更新。 - 日期格式验证:用
findstr正则表达式筛选符合YYYY-MM-DD格式的文件夹,避免非日期命名的目录被误处理。 - 日期范围判断:利用
YYYY-MM-DD格式的字符串可直接按字典序比较的特性,判断文件夹日期是否在近5天范围内。 - 逐个同步文件夹:对每个符合条件的文件夹,单独执行WinSCP同步命令,将本地文件夹同步到SFTP对应路径(
/mnt/logs/test/[日期文件夹名])。
注意事项
- 确保网络驱动器
Z:已正常挂载,且Z:\test\folder1下的日期文件夹名称严格为YYYY-MM-DD格式。 - WinSCP日志会记录所有同步操作,可通过日志排查同步失败的具体原因。
- 若需要同步多个日期文件夹,脚本会逐个处理,每个文件夹的同步结果会单独输出。
内容的提问来源于stack exchange,提问作者RKIDEV
相关产品推荐
相关产品推荐

