批处理脚本获取文件名中间日期,实现robocopy每日文件复制
如何提取文件名中的日期部分,用robocopy复制当日生成的文件?
嘿,这个问题我刚好处理过!针对你说的文件名格式——小时_日期_用户名_计算机名(比如8-05-21_09-05-2019_wolverine_WCALL1-010),我们可以用批处理的字符串拆分功能精准提取日期,再结合系统日期筛选出当日文件,完美适配robocopy的需求。
第一步:提取单个文件名的日期部分
文件名用下划线分隔,日期是第二个分段。我们可以用for /f命令按下划线拆分字符串:
:: 示例文件名 set "filename=8-05-21_09-05-2019_wolverine_WCALL1-010" :: 拆分并提取第二个分段(日期) for /f "tokens=2 delims=_" %%a in ("%filename%") do set "file_date=%%a" :: 此时file_date的值就是09-05-2019
第二步:获取系统当前日期(匹配文件名格式)
批处理的%date%变量格式会随系统区域设置变化,假设你的系统日期是MM/dd/yyyy(比如09/05/2019),我们需要把它转换成和文件名一致的MM-dd-yyyy格式:
for /f "tokens=1-3 delims=/" %%a in ("%date%") do set "current_date=%%a-%%b-%%c"
如果你的系统日期是dd/MM/yyyy(比如05/09/2019),只需要调整tokens的顺序:
for /f "tokens=1-3 delims=/" %%a in ("%date%") do set "current_date=%%b-%%a-%%c"
第三步:完整的批处理脚本(自动筛选并复制当日文件)
把上面的逻辑整合起来,遍历目录下所有符合格式的文件,对比日期后调用robocopy:
@echo off setlocal enabledelayedexpansion :: 调整这里的日期格式转换逻辑,匹配你的系统区域 for /f "tokens=1-3 delims=/" %%a in ("%date%") do set "current_date=%%a-%%b-%%c" :: 遍历本地目录下所有符合"_分隔四段"格式的文件 for %%f in (*_*_*_*) do ( :: 提取当前文件的日期部分 for /f "tokens=2 delims=_" %%d in ("%%~nf") do set "file_date=%%d" :: 对比日期,匹配则执行复制 if "!file_date!"=="%current_date%" ( :: robocopy语法:robocopy 源文件路径 目标目录 文件名 robocopy "%%~dp." "\\server\files" "%%~nf" echo 已成功复制:%%~nf ) ) endlocal
小提示:
%%~dp.表示当前脚本所在的本地目录(你可以替换成实际的文件目录),%%~nf是不带扩展名的文件名,启用enabledelayedexpansion是为了在循环中实时读取变量值。
备选方案:用robocopy的/maxage参数(依赖文件修改时间)
如果文件的修改时间和文件名中的生成日期完全一致,也可以直接用robocopy自带的参数简化操作:
robocopy "本地文件目录" "\\server\files" /maxage:1
/maxage:1表示复制1天内修改过的文件,但这个方法依赖文件修改时间的准确性,不如提取文件名日期的方法精准。
内容的提问来源于stack exchange,提问作者Douglas Filipe
相关产品推荐
相关产品推荐

