You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

批处理脚本实现:选取指定数量XML文件并传输至远程服务器

批量选取并传输指定数量XML文件的批处理方案

我来帮你改造现有的批处理脚本,实现批量选取前x个.xml文件并传输的需求,同时也会针对你提到的“每n个文件重复命名结构”的情况,提供按组选取的方案。

一、基础版:选取前x个最新(或最早)的XML文件

这个方案适用于直接按创建时间选取指定数量的文件,不管命名模式。

修改后的完整脚本

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

:: -------------------------- 自定义参数 --------------------------
SET "source_dir=C:\sample\Test"       :: 源文件所在文件夹
SET "file_ext=*.xml"                  :: 要筛选的文件后缀
SET "num_files=3"                     :: 要选取的文件数量(x)
SET "remote_path=/test/async_messages/" :: 远程服务器目标路径
SET "winscp_path=C:\Program Files (x86)\WinSCP\WinSCP.com" :: WinSCP命令行工具路径
SET "sftp_url=sftp://username:password@ip_address/" :: SFTP连接地址
SET "hostkey=ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" :: 服务器hostkey
:: ----------------------------------------------------------------

:: 按创建时间降序(最新在前)提取前%num_files%个文件,存到变量中
SET "files="
SET "count=0"
FOR /F "delims=" %%a IN ('dir /s /b /a-d /o:-d "%source_dir%\%file_ext%"') DO (
    SET "files=!files! "%%a""
    SET /A count+=1
    IF !count! EQU %num_files% GOTO :stop_loop
)
:stop_loop

:: 检查是否找到文件
IF %count% EQU 0 (
    ECHO 未找到符合条件的.xml文件,请检查路径!
    PAUSE
    EXIT /B 1
)

ECHO 即将传输以下文件:
ECHO !files!

:: 调用WinSCP批量上传
"%winscp_path%" ^
/command ^
"open %sftp_url% -hostkey=""%hostkey%""" ^
"put %files% %remote_path%" ^
"exit"

ECHO 文件传输完成!
ENDLOCAL
PAUSE

关键部分解释

  1. SETLOCAL ENABLEDELAYEDEXPANSION:启用延迟变量扩展,确保在for循环中能动态更新filescount变量。
  2. dir /s /b /a-d /o:-d
    • /s:遍历子文件夹
    • /b:只输出文件路径
    • /a-d:排除文件夹
    • /o:-d:按创建时间降序排列(最新的文件先被选中);如果要选最早的x个,改成/o:d即可。
  3. WinSCP批量上传put命令支持一次性传入多个文件路径(用空格分隔),直接把files变量传进去就能批量传输。

二、进阶版:按命名模式分组选取文件

针对你提到的“每n个文件重复命名结构”(比如Add_Service_AS779.xmlModify_Service_MS779.xmlDelete_Service_DS779.xml为一组,数字部分相同),可以按组选取指定数量的文件组。

完整脚本

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

:: -------------------------- 自定义参数 --------------------------
SET "source_dir=C:\sample\Test"       :: 源文件所在文件夹
SET "num_groups=2"                    :: 要选取的文件组数量(x组)
SET "remote_path=/test/async_messages/" :: 远程服务器目标路径
SET "winscp_path=C:\Program Files (x86)\WinSCP\WinSCP.com" :: WinSCP命令行工具路径
SET "sftp_url=sftp://username:password@ip_address/" :: SFTP连接地址
SET "hostkey=ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx" :: 服务器hostkey
:: ----------------------------------------------------------------

:: 提取所有唯一的数字标识(从文件名中提取779、554这类数字)
SET "unique_nums="
FOR /F "delims=" %%a IN ('dir /s /b /a-d /o:-d "%source_dir%\*.xml"') DO (
    :: 从文件名中提取数字部分(这里适配你的命名格式:Add_Service_ASXXX.xml)
    FOR /F "tokens=3 delims=_S" %%b IN ("%%~na") DO (
        :: 避免重复添加相同数字
        IF NOT "!unique_nums!" == "!unique_nums:*%%b=!" (
            SET "unique_nums=!unique_nums! %%b"
        )
    )
)

:: 选取前%num_groups%个数字组,收集对应文件
SET "count=0"
SET "files="
FOR %%n IN (%unique_nums%) DO (
    :: 找到对应数字的所有相关文件
    FOR /F "delims=" %%a IN ('dir /s /b /a-d "%source_dir%\*_S%%n.xml"') DO (
        SET "files=!files! "%%a""
    )
    SET /A count+=1
    IF !count! EQU %num_groups% GOTO :stop_group_loop
)
:stop_group_loop

:: 执行传输
IF NOT "!files!" == "" (
    ECHO 即将传输以下文件组:
    ECHO !files!
    "%winscp_path%" ^
    /command ^
    "open %sftp_url% -hostkey=""%hostkey%""" ^
    "put %files% %remote_path%" ^
    "exit"
    ECHO 文件组传输完成!
) ELSE (
    ECHO 未找到符合条件的文件组,请检查命名格式!
)

ENDLOCAL
PAUSE

关键部分解释

  1. 数字提取规则FOR /F "tokens=3 delims=_S" %%b IN ("%%~na") 是针对你的命名格式(Add_Service_AS779.xml)提取数字779:
    • delims=_S:以_S作为分隔符
    • tokens=3:取第3个分隔后的部分(AddService779
      如果你的命名格式有变化,需要调整delimstokens参数。
  2. 按组收集文件:通过唯一数字找到同组的所有文件,确保一次传输一整套Add/Modify/Delete文件。

注意事项

  • 请替换脚本中的所有自定义参数(用户名、密码、IP、hostkey等),hostkey可以从WinSCP图形界面连接服务器后复制。
  • 如果源文件夹没有子文件夹,可以去掉dir命令中的/s参数,提升效率。

内容的提问来源于stack exchange,提问作者Gaurav Marothia

火山引擎 最新活动