中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-13 05:49
中国DOS联盟论坛 » DOS学习入门 & 精彩文章 (教学室) » [诡异至极]电脑咋这么笨呢?(见9楼) 查看 1,348 回复 12
楼 主 [诡异至极]电脑咋这么笨呢?(见9楼) 发表于 2007-10-05 19:27 ·  中国 黑龙江 哈尔滨 联通
初级用户
积分 64
发帖 27
注册 2007-10-03 11:01
18年会员
UID 98818
性别 男
状态 离线
我写了这么个批处理
a.bat
=====================
for %%f in (*.txt) do (
if not %%f==3.txt (ren %%f %%f.ok
) else ren 4.txt 2.txt
dir/b)
pause
=====================

a.bat所在目录有4个txt文件
1.txt 2.txt 3.txt 4.txt

for循环会遍历这4个文件,但是当处理到3.txt时,我把4.txt重命名为2.txt,本指望下次会迭代到2.txt这个文件(虽然2.txt已处理过,但此时的2.txt已不是原来的文件了),但电脑反映似乎太迟钝,仍然去处理4.txt,当然就产生了“系统找不到指定文件”的错误

换句话说,自从for开始执行,它就确定了它所处理的对象(由文件名唯一标识,而不是文件本身),即使已经发生改变,也义无返顾

有点类似于变量延迟

有没有什么解决办法呢?

[ Last edited by ssyfzy on 2007-10-7 at 01:27 PM ]
2 发表于 2007-10-06 01:17 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
这个问题比较有意思。

换句话说,自从for开始执行,它就确定了它所处理的对象(由文件名唯一标识,而不是文件本身),即使已经发生改变,也义无返顾

的确是这样,for命令的运行对象总是in后面的括号,它总会先得到括号里面的内容,再对括号里面的“对象”执行do后面指定的命令。
换句话说,也就是do后面的命令无法改变in后面括号中产生的“对象”。

有点类似于变量延迟

感觉和“变量延迟”恰恰相反,变量延迟可以简单的理解成使for命令内的变量生效,而这里的do后面的命令使文件不存在,并没有影响for的“循环对象”的内容。

有没有什么解决办法呢?

可以加上一个“if exist file”先判断文件是否存在,再感觉判断来执行命令,即存在文件则重命名文件,否则忽略执行。
3 发表于 2007-10-06 06:20 ·  中国 黑龙江 哈尔滨 教育网
初级用户
积分 64
发帖 27
注册 2007-10-03 11:01
18年会员
UID 98818
性别 男
状态 离线

感觉和“变量延迟”恰恰相反

我的意思是没有变量延迟,呵呵


可以加上一个“if exist file”先判断文件是否存在,再感觉判断来执行命令,即存在文件则重命名文件,否则忽略执行

不行的

还是以我的例子:
我把4.txt改名为2.txt
我希望下次处理2.txt
但下次仍去处理4.txt,你可以去判断4.txt是否存在,但电脑仍不会去处理2.txt

[ Last edited by ssyfzy on 2007-10-6 at 06:26 AM ]
4 发表于 2007-10-06 08:57 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
Originally posted by ssyfzy at 2007-10-6 06:20:

我的意思是没有变量延迟,呵呵


不行的

还是以我的例子:
我把4.txt改名为2.txt
我希望下次处理2.txt
但下次仍去处理4.txt,你可以去判断4.txt是否存 ...

你还是没有理解我的这句话:
do后面的命令无法改变in后面括号中产生的“对象”。
5 发表于 2007-10-06 09:02 ·  中国 黑龙江 哈尔滨 教育网
初级用户
积分 64
发帖 27
注册 2007-10-03 11:01
18年会员
UID 98818
性别 男
状态 离线
Originally posted by lxmxn at 2007-10-6 08:57 AM:

你还是没有理解我的这句话:


我知道

我是说你的解决方案行不通
6 发表于 2007-10-06 09:08 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
不是我的方案不行,而是你没有理解我的那句话。
你想在for里面回过去处理2.txt,那是不可能的,除非你指定具体的文件名,否则不可能用%%a来迭代的。
7 发表于 2007-10-06 11:31 ·  中国 山东 青岛 电信
初级用户
★★
剑气冰心
积分 178
发帖 69
注册 2007-09-07 19:59
18年会员
UID 96812
性别 男
状态 离线
经典
你想免费打电话么?你想认识更多的美女帅哥么?中国最优秀的网络电话!http://shutter.cdream.com/register.php?linkid=98188
成功永远属于你!
8 发表于 2007-10-06 19:12 ·  中国 黑龙江 哈尔滨 联通
初级用户
积分 64
发帖 27
注册 2007-10-03 11:01
18年会员
UID 98818
性别 男
状态 离线
真的没有解决方案了吗?
遗憾啊
9 发表于 2007-10-07 13:18 ·  中国 黑龙江 哈尔滨 联通
初级用户
积分 64
发帖 27
注册 2007-10-03 11:01
18年会员
UID 98818
性别 男
状态 离线
更离奇了:
文件夹中有4个txt文件
a.txt,b.txt,c.txt,d.txt
和一个批处理,ren.bat:
(大家运行一下)
@echo off
setlocal enabledelayedexpansion
for %%a in (*.txt) do (
set i=%%a
call :ag
)
echo.
echo for命令的in集合
echo ===============
dir/b *.txt
echo ===============
echo.
for %%b in (*.txt) do (
set/a m+=1
echo ren----"%%b"----!m!.txt
ren "%%b" !m!.txt)
pause
exit
:ag
set/a n+=1
if exist "#!n!.txt" goto ag
echo ren----%i%-----"#!n!.txt"
ren "%i%" "#!n!.txt"

运行后变成2.txt,3.txt,4.txt,5.txt
其中1.txt又被重命名为5.txt了
后一个for命令本来只处理4个文件,怎么变成5个了?

[ Last edited by ssyfzy on 2007-10-7 at 01:23 PM ]
10 发表于 2007-10-07 17:25 ·  中国 湖北 武汉 电信
版主
★★★★★
积分 11,386
发帖 4,938
注册 2006-07-23 17:10
20年会员
UID 59080
状态 离线
呵呵,怪现象,我等无从解释。

昨天讨论的在一个语句体里面goto也是有点怪!
11 恩不错的论坛 发表于 2007-10-08 07:22 ·  中国 福建 福州 电信
新手上路
积分 6
发帖 3
注册 2007-10-08 06:38
18年会员
UID 99163
性别 男
状态 离线
没白来HOHO
12 发表于 2007-10-08 19:16 ·  中国 江西 南昌 电信
中级用户
★★
积分 245
发帖 123
注册 2007-06-08 09:04
19年会员
UID 90636
性别 女
状态 离线
真是厉害
13 发表于 2007-10-09 23:38 ·  中国 福建 福州 电信
新手上路
积分 18
发帖 9
注册 2007-10-08 17:47
18年会员
UID 99197
性别 男
状态 离线
听不懂啊
论坛跳转: