找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 47501|回复: 9

批处理for的嵌套循环

[复制链接]
发表于 2008-6-17 14:08:03 | 显示全部楼层 |阅读模式
先来看小弟的一段“呆马”:
@if not defined dbug echo off
set v=a;b;c;d;e
echo %v%>v.txt
for /l %%a in (1,1,5) do (
for /f "tokens=%%a delims=;" %%i in (v.txt) do echo %%i

运行结果:
%a delims=;" was unexpected at this time.
%a delims=;" was unexpected at this time.
%a delims=;" was unexpected at this time.
%a delims=;" was unexpected at this time.
%a delims=;" was unexpected at this time.

看来"tokens=%%a"是不支持for中嵌套的变量的,于是乎,我改为:

@if not defined dbug echo off
setlocal EnableDelayedExpansion
set i=0
set v=a;b;c;d;e
echo %v%>v.txt
for /l %%a in (1,1,5) do (
set i=%%a
echo !i!
for /f "tokens=%i% delims=;" %%i in (v.txt) do echo %%i
)
运行结果:
1
delims=;" was unexpected at this time.
2
delims=;" was unexpected at this time.
3
delims=;" was unexpected at this time.
4
delims=;" was unexpected at this time.
5
delims=;" was unexpected at this time.



还是不行啊,快来帮帮我吧,高手们!
发表于 2008-6-17 23:05:22 | 显示全部楼层
嵌套中for的in前面部分不能使用变量
发表于 2008-6-18 04:19:57 | 显示全部楼层
如楼上所说,不能用变量,但可以用 call 变个方式来实现你的目的
  1. @echo off
  2. set v=a;b;c;d;e
  3. echo %v%>v.txt
  4. for /l %%a in (1,1,5) do call :aa %%a
  5. pause
  6. :aa
  7. for /f "tokens=%1 delims=;" %%i in (v.txt) do echo %%i
  8. goto :eof
复制代码
 楼主| 发表于 2008-6-18 09:42:41 | 显示全部楼层
3楼很强啊,我已经琢磨了几天了,谢!
不过,您好像没有加入判断推出,这个程序执行到最后一次的时候是for /f "tokens=空 delims=;" %%i in (v.txt) do echo %%i
所有我想把这个case结了,加了个判断语句,但是没有起到作用(就是判断%%a循环到最后一步,推出循环),让我们一起来完善这个case吧。
@if not defined dbug echo off
set v=a;b;c;d;e
echo %v%>v.txt
for /l %%a in (1,1,5) do call :aa %%a
:aa
for /f "tokens=%1 delims=;" %%i in (v.txt) do echo %%i
if "%1"=="5" goto :end
:end
发表于 2008-6-18 13:24:29 | 显示全部楼层

楼主是不是要这样啊

  1. @echo off
  2. for %%i in (a b c d e) do echo %%i
  3. pause>nul
复制代码

[ 本帖最后由 zw19750516 于 2008-6-18 13:30 编辑 ]
发表于 2008-6-18 14:37:12 | 显示全部楼层
@echo off
set v=a;b;c;d;e
echo %v%>v.txt
for /l %%a in (1,1,5) do call :aa %%a
pause
:aa
for /f "tokens=%1 delims=;" %%i in (v.txt) do echo %%i
goto :eof

怎么会有空呢?

第二个for是第一个调用的,当第一个for循环第一次,也就是当 a=1时,tokens也就等于1,取第一个字符后退出循环执行 goto :eof 跳转到第一个for继续下一次循环,这次 a=2 ,tokens也就是2,第二个for取第二个字符后又goto :eof 回到第一个for中,当第一个for的a=5时,tokens=5执行取第5个字符后又 goto :eof 回到第一个for,这时,已经达到最大数5,退出for循环,那么第二个for也就不会被执行,应该不会出现tokens等于空的问题

你写的那个是错的
  1. @if not defined dbug echo off
  2. set v=a;b;c;d;e
  3. echo %v%>v.txt
  4. for /l %%a in (1,1,5) do call :aa %%a
  5. pause
  6. :aa
  7. for /f "tokens=%1 delims=;" %%i in (v.txt) do echo %%i
  8. if "%1"=="5" goto :end
  9. goto :eof
复制代码
这样才行,但后面的 if 是多余的,当%1=5时也就是第一个for执行到了最后一次,不会再执行了,所以,这里的判断没什么作用

个人见解,错了请原谅
发表于 2008-6-18 16:01:46 | 显示全部楼层
不知道是不是这个意思

@if not defined dbug echo off
set v=a;b;c;d;e
echo %v%>v.txt
for /l %%a in (1,1,5) do call :aa %%a
goto :end
:aa
for /f "tokens=%1 delims=;" %%i in (v.txt) do echo %%i
if "%1"=="5" goto :end
:end
 楼主| 发表于 2008-6-19 09:27:03 | 显示全部楼层
大家可以试一下,7楼是对的,我的那个也错了,大家可以运行一下,我就不截图了,case closed,感谢大家!
发表于 2008-6-19 10:04:14 | 显示全部楼层
原帖由 xintiruan 于 2008-6-19 09:27 发表
大家可以试一下,7楼是对的,我的那个也错了,大家可以运行一下,我就不截图了,case closed,感谢大家!


我个人认为7楼的也不对,这样也许会好些(我就不写入另外的文件了,其实是一样的):

  1. @echo off
  2. set "v=a;b;c;d;e"
  3. for /l %%a in (1 1 5) do call :aa %%a
  4. pause
  5. goto :eof
  6. :aa
  7. for /f "tokens=%1 delims=;" %%i in ("%v%") do (
  8.    echo %%i
  9. )
复制代码
发表于 2011-12-31 00:42:31 | 显示全部楼层
正用到这部分,,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 18:22 , Processed in 0.019824 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表