中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-17 13:13
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 这是for/r的bug吗 查看 1,137 回复 10
楼 主 这是for/r的bug吗 发表于 2008-01-08 12:44 ·  印度 马哈拉施特拉邦 孟买郊区县 腾讯云
新手上路
积分 10
发帖 4
注册 2007-11-19 10:19
UID 103104
性别 男
状态 离线
代码如下:
@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)以上代码不能如愿。希望大家帮忙看看是什么原因,谢谢!
2 发表于 2008-01-08 13:54 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
不是bug,你想如何排序呢?
3 回复lxmxn 发表于 2008-01-08 18:11 ·  印度 马哈拉施特拉邦 孟买郊区县 腾讯云
新手上路
积分 10
发帖 4
注册 2007-11-19 10:19
UID 103104
性别 男
状态 离线
首先,感谢版主对此问题的回应。
或许时间原因,版主似乎并没有认真看过我的代码(也许是太简单的缘故)。但也许是我表述的不好,所以我再啰嗦一遍,希望能说清楚:我的代码的本意是将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。
不知说清楚没有.......
4 发表于 2008-01-08 20:15 ·  中国 福建 福州 连江县 电信
中级用户
★★
积分 356
发帖 115
注册 2004-07-27 00:00
UID 29114
性别 男
状态 离线
我测试文件数十几个都可以的,怪了,为何楼主不能超过6个。
5 回复daowuwei 发表于 2008-01-08 20:46 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
不好意思,先前没有测试。

测试之后发现果然有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


真是怪哉。。。
6 发表于 2008-01-08 20:57 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
UID 74552
性别 男
状态 离线
把扩展名改了试试
7 发表于 2008-01-08 21:29 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
UID 59080
状态 离线
Originally posted by everest79 at 2008-1-8 20:57:
把扩展名改了试试

改了似乎也没有用。
8 发表于 2008-01-08 21:46 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
一叶枝头,万树皆春
积分 2,564
发帖 1,127
注册 2006-12-25 22:57
UID 74552
性别 男
状态 离线
出现重复命令可能是for /r提取的文件是即时性生成的
for /r %i in (*.txt) do ren %i %~dpni.sss

ren *.sss *.txt
9 发表于 2008-01-09 00:10 ·  中国 福建 泉州 电信
银牌会员
★★★
积分 1,276
发帖 469
注册 2002-12-23 13:00
UID 586
性别 男
来自 福建泉州
状态 离线
使用临时文件,或者不使用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)
QQ:366840202
http://chenall.net
10 发表于 2008-01-20 13:51 ·  中国 湖北 武汉 武昌区 电信
中级用户
★★
积分 452
发帖 202
注册 2006-12-21 13:46
UID 74161
性别 女
状态 离线
一:
@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"
11 发表于 2008-01-25 21:09 ·  印度 马哈拉施特拉邦 孟买郊区县 腾讯云
新手上路
积分 10
发帖 4
注册 2007-11-19 10:19
UID 103104
性别 男
状态 离线
感谢以上各位,特别是429499381版主。好久没上来了,没想到今天一来就有所收获。
论坛跳转: