标题: 这是for/r的bug吗
[打印本页]
作者: daowuwei
时间: 2008-1-8 12:44
标题: 这是for/r的bug吗
代码如下:
@echo off
setlocal enabledelayedexpansion
set a=0
for /r d:\test %%i in (*) do (
set/a a+=1
ren "%%i" !a!-"%%~nxi"
)
pause
我的意图是将d:\test中的所有文件排序,但是当文件数过大时(我测试最大为6)以上代码不能如愿。希望大家帮忙看看是什么原因,谢谢!
作者: lxmxn
时间: 2008-1-8 13:54
作者: daowuwei
时间: 2008-1-8 18:11
标题: 回复lxmxn
首先,感谢版主对此问题的回应。
或许时间原因,版主似乎并没有认真看过我的代码(也许是太简单的缘故)。但也许是我表述的不好,所以我再啰嗦一遍,希望能说清楚:我的代码的本意是将d:\test中的所有文件依次依序重命名,如下例子:
原文件名:a.txt,b.txt,c.txt,d.txt.......
重命名:1-a.txt,2-b.txt,3-c.txt,4-d.txt.....
但是当d:\test中的文件数超过6个以后,问题就来了。具体问题希望大家copy and run。
不知说清楚没有.......
作者: balinger
时间: 2008-1-8 20:15
我测试文件数十几个都可以的,怪了,为何楼主不能超过6个。
作者: lxmxn
时间: 2008-1-8 20:46
标题: 回复daowuwei
不好意思,先前没有测试。
测试之后发现果然有bug,但我测试的结果视乎和你不一样,原文件名是“file1.txt”到“file50”,修改之后,却成了下面这样的:
1-file1.txt
2-file2.txt
3-file3.txt
4-file4.txt
5-file5.txt
6-file6.txt
7-file7.txt
8-file8.txt
9-file9.txt
12-file12.txt
14-file14.txt
16-file16.txt
18-file18.txt
20-file20.txt
22-file22.txt
24-file24.txt
26-file26.txt
28-file28.txt
30-file30.txt
32-file32.txt
34-file34.txt
36-file36.txt
38-file38.txt
40-file40.txt
42-file42.txt
44-file44.txt
46-file46.txt
48-file48.txt
50-file50.txt
52-11-file11.txt
54-15-file15.txt
55-17-file17.txt
57-21-file21.txt
58-23-file23.txt
60-27-file27.txt
61-29-file29.txt
63-33-file33.txt
64-35-file35.txt
66-39-file39.txt
67-41-file41.txt
69-45-file45.txt
70-47-file47.txt
72-51-10-file10.txt
73-53-13-file13.txt
74-56-19-file19.txt
75-59-25-file25.txt
76-62-31-file31.txt
77-65-37-file37.txt
78-68-43-file43.txt
79-71-49-file49.txt
真是怪哉。。。
作者: everest79
时间: 2008-1-8 20:57
作者: lxmxn
时间: 2008-1-8 21:29
Originally posted by everest79 at 2008-1-8 20:57:
把扩展名改了试试
改了似乎也没有用。
作者: everest79
时间: 2008-1-8 21:46
出现重复命令可能是for /r提取的文件是即时性生成的
for /r %i in (*.txt) do ren %i %~dpni.sss
ren *.sss *.txt
作者: chenall
时间: 2008-1-9 00:10
使用临时文件,或者不使用for /r
改为
setlocal enabledelayedexpansion
set ds=d:\test
set a=0
for /f %%i in ('dir /b %ds%') do (set/aa+=1&ren %ds%\%%i !a!-%%i)
作者: 429499381
时间: 2008-1-20 13:51
一:
@echo off
setlocal enabledelayedexpansion
c: &mkdir 2 & cd 2
for /l %%a in (1,1,50) do echo.>>file%%a.txt
set a=0
for /r c:\2 %%i in (*) do (
set/a a+=1
ren "%%i" !a!["%%~nxi"
)
事实上的确跟FOR /r 有关 , 不过并不是每次都会出现意料之外的结果
需要满足2个条件 1: 有特许字符 如 ? *
(没命令扩展,只有? * 也会会有外遇)
2: 需要命令扩展
@echo off
setlocal enabledelayedexpansion
i: &mkdir 2 & cd 2
for /l %%a in (1,1,50) do echo.>>file%%a.txt
set a=0
for /r i:\2 %%i in (*) do (
set/a a+=1
ren "%%i" !a!?.txt
)
@echo off
setlocal enabledelayedexpansion
i: &mkdir 2 & cd 2
for /l %%a in (1,1,50) do echo.>>file%%a.txt
set a=0
for /r i:\2 %%i in (*) do (
set/a a+=1
ren "%%i" !a!*.txt
)
目前已知就几个, 不过只要有for命令扩展, 出外遇的几率越大。
替换下第一个例子,这不是全部, :P
!a!-"%%~nxi"
!a!}"%%~nxi"
!a!{"%%~nxi"
!a!]"%%~nxi"
!a!["%%~nxi"
!a!~"%%~nxi"
作者: daowuwei
时间: 2008-1-25 21:09
感谢以上各位,特别是429499381版主。好久没上来了,没想到今天一来就有所收获。