Batch文件双层循环使用问题:获取日期命名子目录下全部.doc文件
问题原因分析
你原来的代码存在以下几处错误导致运行不符合预期:
- 内外层循环重复使用了循环变量
%%i,导致变量值冲突,内层无法正确获取外层遍历到的目录路径 - 内层
for /R命令的根目录参数写法错误,for /R后如果要指定遍历根路径,需要将路径放在/R和循环变量之间,路径含空格时必须用引号包裹 - 循环块内直接使用
%time%变量,会在脚本解析阶段就完成替换,导致所有日志的时间戳都是脚本启动时的固定值,不会随循环实时更新 - 未判断日志存放目录是否存在,若
logs目录不存在会直接导致日志写入失败 - 切换盘符和目录的顺序错误,
cd %Pathname%在当前盘符不是D盘时不会生效 - 定义
Pathname变量时将引号包含在变量值内,后续拼接路径时容易出现双引号嵌套错误
修正后的完整代码
@echo off setlocal enabledelayedexpansion chcp 1252 >nul :: 配置根目录,引号放在变量外避免值内含引号 set "Pathname=D:\testDir" :: 提取当前日期,注意该写法依赖系统区域设置,若日期格式不符可自行调整截取位置 set "year=%date:~-4%" set "month=%date:~-7,2%" set "day=%date:~-10,2%" set "date_suffix=%year%_%month%_%day%" :: 日志路径配置,提前创建日志目录 set "logdir=%Pathname%\logs" set "logfile=%logdir%\log.txt" if not exist "%logdir%" md "%logdir%" :: 直接跨盘符切换到根目录 cd /d "%Pathname%" :: 外层遍历所有名称包含当前日期的目录 for /D /R %%d in (*%date_suffix%*) do ( :: 内层以上层遍历到的日期目录为根,递归查找所有doc文件 for /R "%%d" %%s in (*.doc) do ( echo "file : %%s worked and does an output at !time!" >> "%logfile%" ) ) endlocal
代码说明
- 新增延迟变量扩展,用
!time!替换原有的%time%,确保每一条日志的时间戳都是实时生成的 - 拆分内外层循环变量,外层用
%%d存储匹配到的日期目录,内层用%%s存储找到的doc文件路径,避免变量冲突 - 补充了日志目录自动创建逻辑,避免写入失败
- 所有路径变量都统一加了引号兼容含空格的场景
- 用
cd /d命令直接跨盘符切换目录,无需单独写盘符切换命令
内容的提问来源于stack exchange,提问作者mrRobot
相关产品推荐
相关产品推荐

