使用批处理脚本移动指定日期范围的目录文件及文件夹并删除源文件
批处理按指定日期范围移动文件并清理源目录解决方案
原脚本问题说明
- 仅支持按天数倒推筛选文件,无法指定起止日期区间
- robocopy参数冲突:
/S(复制子目录不含空目录)和/E(复制子目录含空目录)同时定义,会按后面的/E生效属于冗余配置 - 切换目录命令写错:
d /d应为cd /d,这是删除操作失效的核心原因 - 删除逻辑会无差别清空源目录所有内容,没有和robocopy的筛选条件对齐,容易误删范围外的文件
可行实现方案
方案1:按天数倒推优化版本(适合按距今天数筛选的需求)
直接使用robocopy自带的移动参数,不需要自行编写删除逻辑,避免误操作:
@echo off setlocal enabledelayedexpansion :: 配置参数 set "Sourcefolder=D:\PurgeScriptExecute\SourceFile" set "Destfolder=D:\PurgeScriptExecute\DestFile" set "_NoOfDays=30" :: /MOVE参数:移动文件+目录,复制完成自动删除源端对应内容 :: /MINAGE:%_NoOfDays%:筛选修改时间早于30天的内容 :: /R:3 /W:5:复制失败重试3次,每次间隔5秒 robocopy "%Sourcefolder%" "%Destfolder%" /E /MINAGE:%_NoOfDays% /MOVE /R:3 /W:5 :: 输出执行结果(robocopy错误码≤1均为正常执行) if %errorlevel% leq 1 ( echo 文件移动成功,已筛选并移动早于%_NoOfDays%天的所有文件及目录 ) else ( echo 移动过程出现错误,错误码:%errorlevel% ) pause endlocal
方案2:指定起止日期筛选版本(支持精确到年月日,比如2021-04-01至2021-04-30)
调用系统自带的PowerShell实现精准日期筛选,兼容性覆盖Win7及以上所有Windows版本:
@echo off setlocal enabledelayedexpansion :: 配置参数 set "Sourcefolder=D:\PurgeScriptExecute\SourceFile" set "Destfolder=D:\PurgeScriptExecute\DestFile" :: 按需求修改起止日期,格式固定为YYYY-MM-DD set "StartDate=2021-04-01" set "EndDate=2021-04-30" :: PowerShell执行逻辑:筛选指定日期范围内的文件,自动创建目标目录层级后移动 powershell -Command "$start = Get-Date '%StartDate%'; $end = Get-Date '%EndDate%'; Get-ChildItem -Path '%Sourcefolder%' -Recurse | Where-Object { $_.LastWriteTime -ge $start -and $_.LastWriteTime -le $end } | Move-Item -Destination { $newPath = $_.FullName.Replace('%Sourcefolder%', '%Destfolder%'); $parent = Split-Path $newPath -Parent; if (!(Test-Path $parent)) { New-Item -ItemType Directory -Path $parent | Out-Null }; $newPath } -Force" if %errorlevel% equ 0 ( echo 已成功移动%StartDate%至%EndDate%范围内的所有文件及目录 ) else ( echo 移动过程出现错误 ) pause endlocal
注意事项
- 正式执行脚本前请先备份源目录文件,确认筛选逻辑符合预期后再运行
- 若需要保留源目录的空目录结构,可去掉robocopy的
/MOVE参数,单独添加和筛选规则对齐的删除逻辑即可 - 方案2的日期格式请严格按照示例填写,避免PowerShell识别日期出错
内容的提问来源于stack exchange,提问作者user14956888
相关产品推荐
相关产品推荐

