![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-13 03:57 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行 |
| DOS学习入门 & 精彩文章 (教学室) » [诡异至极]电脑咋这么笨呢?(见9楼) |
| 可打印版本 1,347 / 12 |
| 第1楼 ssyfzy | 发表于 2007-10-05 19:27 |
| 初级用户 发帖 27 积分 64 | |
|
[诡异至极]电脑咋这么笨呢?(见9楼) 我写了这么个批处理
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楼 lxmxn | 发表于 2007-10-06 01:17 |
| 版主 发帖 4,938 积分 11,386 | |
|
这个问题比较有意思。
换句话说,自从for开始执行,它就确定了它所处理的对象(由文件名唯一标识,而不是文件本身),即使已经发生改变,也义无返顾 的确是这样,for命令的运行对象总是in后面的括号,它总会先得到括号里面的内容,再对括号里面的“对象”执行do后面指定的命令。 换句话说,也就是do后面的命令无法改变in后面括号中产生的“对象”。 有点类似于变量延迟 感觉和“变量延迟”恰恰相反,变量延迟可以简单的理解成使for命令内的变量生效,而这里的do后面的命令使文件不存在,并没有影响for的“循环对象”的内容。 有没有什么解决办法呢? 可以加上一个“if exist file”先判断文件是否存在,再感觉判断来执行命令,即存在文件则重命名文件,否则忽略执行。 |
|
| 第3楼 ssyfzy | 发表于 2007-10-06 06:20 |
| 初级用户 发帖 27 积分 64 | |
我的意思是没有变量延迟,呵呵
不行的 还是以我的例子: 我把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楼 lxmxn | 发表于 2007-10-06 08:57 |
| 版主 发帖 4,938 积分 11,386 | |
Originally posted by ssyfzy at 2007-10-6 06:20: 你还是没有理解我的这句话: do后面的命令无法改变in后面括号中产生的“对象”。 |
|
| 第5楼 ssyfzy | 发表于 2007-10-06 09:02 |
| 初级用户 发帖 27 积分 64 | |
Originally posted by lxmxn at 2007-10-6 08:57 AM: 我知道 我是说你的解决方案行不通 |
|
| 第6楼 lxmxn | 发表于 2007-10-06 09:08 |
| 版主 发帖 4,938 积分 11,386 | |
|
不是我的方案不行,而是你没有理解我的那句话。
你想在for里面回过去处理2.txt,那是不可能的,除非你指定具体的文件名,否则不可能用%%a来迭代的。 |
|
| 第7楼 ab200210 | 发表于 2007-10-06 11:31 |
| 初级用户 发帖 69 积分 178 | |
|
经典
|
|
| 第8楼 ssyfzy | 发表于 2007-10-06 19:12 |
| 初级用户 发帖 27 积分 64 | |
|
真的没有解决方案了吗?
遗憾啊 |
|
| 第9楼 ssyfzy | 发表于 2007-10-07 13:18 |
| 初级用户 发帖 27 积分 64 | |
|
更离奇了:
文件夹中有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楼 lxmxn | 发表于 2007-10-07 17:25 |
| 版主 发帖 4,938 积分 11,386 | |
|
呵呵,怪现象,我等无从解释。
昨天讨论的在一个语句体里面goto也是有点怪! |
|
| 第11楼 rsgfl | 发表于 2007-10-08 07:22 |
| 新手上路 发帖 3 积分 6 | |
|
恩不错的论坛 没白来HOHO
|
|
| 第12楼 hxwxyz | 发表于 2007-10-08 19:16 |
| 中级用户 发帖 123 积分 245 | |
|
真是厉害
|
|
| 第13楼 zsewqsc | 发表于 2007-10-09 23:38 |
| 新手上路 发帖 9 积分 18 | |
|
听不懂啊
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |