如何使用WinSCP批处理文件读取指定文件夹并同步数据?
批处理脚本解决方案:筛选指定文件夹+日期范围同步
一、筛选一级目录下的目标文件夹
要仅处理三位数字命名和data文件夹,需在遍历目录时添加过滤逻辑:
- 用
findstr正则匹配严格三位数字的文件夹(^[0-9][0-9][0-9]$) - 单独判断文件夹名是否为
data(不区分大小写)
核心过滤代码片段:
for /d %%i in ("%SOURCE_PATH%\*") do ( :: 匹配三位数字文件夹 或者 data文件夹 echo %%~nxi | findstr /r "^[0-9][0-9][0-9]$" >nul || if /i "%%~nxi"=="data" ( :: 后续同步逻辑放在此处 ) )
二、用日期范围替代DAYS变量
批处理原生处理日期范围较繁琐,可借助PowerShell生成指定区间内的所有日期字符串(格式yyyy-mm-dd),再传递给批处理循环。只需修改起始和结束日期,即可覆盖任意时间区间。
日期范围生成逻辑:
:: 定义你的日期区间 SET START_DATE=2024-05-01 SET END_DATE=2024-05-10 :: 用PowerShell生成日期列表并循环处理 for /f "delims=" %%d in ('powershell -Command "$start = [DateTime]'%START_DATE%'; $end = [DateTime]'%END_DATE%'; for ($dt = $start; $dt -le $end; $dt = $dt.AddDays(1)) { $dt.ToString('yyyy-MM-dd') }"') do ( :: 对每个日期%%d执行同步操作 )
三、完整修改后的脚本
整合上述逻辑,修正原脚本的路径遍历问题,最终脚本如下:
@echo off SETLOCAL ENABLEDELAYEDEXPANSION SET SOURCE_PATH=Z:\Logs SET DEST_PATH=/mnt/logs/test :: 替换为需要的日期区间 SET START_DATE=2024-05-01 SET END_DATE=2024-05-10 :: 遍历日期范围内的每一天 for /f "delims=" %%d in ('powershell -Command "$start = [DateTime]'%START_DATE%'; $end = [DateTime]'%END_DATE%'; for ($dt = $start; $dt -le $end; $dt = $dt.AddDays(1)) { $dt.ToString('yyyy-MM-dd') }"') do ( :: 遍历源目录下符合条件的文件夹 for /d %%i in ("%SOURCE_PATH%\*") do ( :: 筛选三位数字文件夹或data文件夹 echo %%~nxi | findstr /r "^[0-9][0-9][0-9]$" >nul || if /i "%%~nxi"=="data" ( :: 执行WinSCP同步操作 "C:\Program Files (x86)\WinSCP\WinSCP.com" ^ /log="C:\Users\rjdhld\WinSCP.log" /ini=nul ^ /command ^ "open sftp://username:%%21o%%26mH%%24@188.22.1.2/ -hostkey=""ssh-ed29 255 s8HgnuJoit0""" ^ "option batch continue" ^ "mkdir %DEST_PATH%/%%~nxi" ^ "mkdir %DEST_PATH%/%%~nxi/%%d" ^ "mkdir %DEST_PATH%/%%~nxi/%%d/ping" ^ "mkdir %DEST_PATH%/%%~nxi/%%d/event" ^ "option batch abort" ^ "synchronize remote ""%%~fi\%%d\ping"" ""%DEST_PATH%/%%~nxi/%%d/ping""" ^ "synchronize remote ""%%~fi\%%d\event"" ""%DEST_PATH%/%%~nxi/%%d/event""" ^ "exit" ) ) ) set WINSCP_RESULT=%ERRORLEVEL% if %WINSCP_RESULT% equ 0 ( echo 同步成功 ) else ( echo 同步失败,错误代码:%WINSCP_RESULT% ) PAUSE exit /b %WINSCP_RESULT%
关键说明
- 文件夹筛选:通过正则匹配确保只处理三位数字文件夹,
if /i实现data文件夹的不区分大小写匹配 - 日期范围:借助PowerShell简化日期遍历,只需修改
START_DATE和END_DATE即可覆盖任意区间 - 路径引号:对可能包含空格的路径添加双引号,避免WinSCP解析出错
- 延迟变量扩展:启用
SETLOCAL ENABLEDELAYEDEXPANSION确保循环内变量正常解析
内容的提问来源于stack exchange,提问作者RAJHLD
相关产品推荐
相关产品推荐

