批处理脚本优化:保留指定子文件夹并清理过期文件
批处理脚本修改方案:排除指定子文件夹删除旧文件
原脚本的第二个forfiles命令会递归删除Z盘下所有30天以上的.xlsx文件,包括归档用的1st_of_Month_Reports子文件夹内的文件。以下是两种无需迁移归档文件的修改方案:
方案一:在forfiles中嵌入路径判断
通过findstr检查文件路径是否包含目标归档文件夹,仅当路径不匹配时执行删除操作,逻辑简洁直接:
net use Z: \\shared\Operations\Analytics\ActivityReports :: 将所有含_01.xlsx的文件移至归档文件夹 forfiles /p Z: /m *_01.xlsx /C "cmd /c move @path \"Z:\1st_of_Month_Reports\"" :: 删除30天以上的.xlsx文件,排除1st_of_Month_Reports子文件夹 forfiles /p Z: /s /m *.xlsx /D -30 /C "cmd /c echo @path | findstr /i /c:\"\\1st_of_Month_Reports\\\" >nul 2>&1 || del @path"
关键逻辑说明
echo @path | findstr /i /c:\"\\1st_of_Month_Reports\\\" >nul 2>&1:检查当前文件的完整路径是否包含归档文件夹的标识,/i忽略大小写,>nul 2>&1屏蔽无关输出||:仅当前面的findstr命令执行失败(即路径不包含归档文件夹)时,才触发后面的del @path删除操作
方案二:用dir+for组合筛选文件
适合需要更复杂筛选规则的场景,先通过dir和findstr过滤掉归档文件夹内的文件,再逐个检查文件是否超过30天并删除:
net use Z: \\shared\Operations\Analytics\ActivityReports :: 将所有含_01.xlsx的文件移至归档文件夹 forfiles /p Z: /m *_01.xlsx /C "cmd /c move @path \"Z:\1st_of_Month_Reports\"" :: 删除30天以上的.xlsx文件,排除1st_of_Month_Reports子文件夹 for /f "delims=" %%f in ('dir /s /b /a-d Z:\*.xlsx ^| findstr /v /i /c:"\1st_of_Month_Reports\"') do ( forfiles /p "%%~dpf" /m "%%~nxf" /D -30 /C "cmd /c del @path" )
关键逻辑说明
dir /s /b /a-d Z:\*.xlsx:递归列出Z盘下所有.xlsx文件的完整路径,/a-d确保只返回文件而非文件夹findstr /v /i /c:"\1st_of_Month_Reports\":反向过滤,剔除路径中包含归档文件夹的文件- 外层
for /f遍历筛选后的文件路径,内层forfiles验证文件是否超过30天,符合条件则执行删除
内容的提问来源于stack exchange,提问作者JPSeagull
相关产品推荐
相关产品推荐

