本帖最后由 batman 于 2011-5-28 13:05 编辑
前言:
这个问题是昨天晚上帮人解决一个文件处理问题时碰到的,害我查错查了一个多小时,最后发现是for /r的问题,现用代码将问题模拟出来,供大家讨论:- @echo off&setlocal enabledelayedexpansion
- set "str=temp\"
- for /l %%a in (1,1,10) do set "str=!str!%%a\"
- if not exist !str! md !str!
- for /l %%a in (1,1,100) do cd.>!str!%%a.txt
- for /r temp %%a in (*.txt) do (
- echo "%%~dpa"
- for /r "%%~dpa" %%b in (*.txt) do echo "%%b"&pause
- echo ok
- for /r "%cd%\temp\1\2\3\4\5\6\7\8\9\10\" %%b in (*.txt) do echo "%%b"&pause
- )
- :: 将上面两个&pause去掉就可删除所创建的环境
- if exist temp rd /s /q temp
复制代码 运行这个代码在我本机上的显示如下:
"D:\批处理\test\temp\1\2\3\4\5\6\7\8\9\10\"
ok
"D:\批处理\test\temp\1\2\3\4\5\6\7\8\9\10\1.txt"
请按任意键继续. . .请按任意键继续. . .
按道理显示应为:
"D:\批处理\test\temp\1\2\3\4\5\6\7\8\9\10\"
"D:\批处理\test\temp\1\2\3\4\5\6\7\8\9\10\1.txt"
如果for /r "%%~dpa" %%b in (*.txt) do echo "%%~dpb"&pause这句正常运行了,那么程序会在这个pause停住,而下面的ok不会显示出来,但实际上却是在for /r "%cd%\temp\1\2\3\4\5\6\7\8\9\10\" %%b in (*.txt) do echo "%%b"&pause上停住了(ok明显显示出来了),这就说明,第一个for /r没有得到正常运行,那么是不是因为目录级数太多了%%~dpa在for /r 中不能扩展为正确的路径啊?大家不妨展开思考和讨论。。。
ps:就是在回这个贴遇到的问题:http://www.bathome.net/thread-12539-1-1.html,最后将for /r改成for %%b in ("%%~dpa*.txt") do ..才解决问题 |