Board logo

标题: 批处理for的嵌套循环 [打印本页]

作者: xintiruan    时间: 2008-6-17 14:08     标题: 批处理for的嵌套循环

先来看小弟的一段“呆马”:
@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

嵌套中for的in前面部分不能使用变量
作者: lovelymorning    时间: 2008-6-18 04:19

如楼上所说,不能用变量,但可以用 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
复制代码

作者: xintiruan    时间: 2008-6-18 09:42

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
作者: batman    时间: 2008-6-18 13:24     标题: 楼主是不是要这样啊

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

[ 本帖最后由 zw19750516 于 2008-6-18 13:30 编辑 ]
作者: lovelymorning    时间: 2008-6-18 14:37

@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执行到了最后一次,不会再执行了,所以,这里的判断没什么作用

个人见解,错了请原谅
作者: Batcher    时间: 2008-6-18 16:01

不知道是不是这个意思

@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
作者: xintiruan    时间: 2008-6-19 09:27

大家可以试一下,7楼是对的,我的那个也错了,大家可以运行一下,我就不截图了,case closed,感谢大家!
作者: more    时间: 2008-6-19 10:04

原帖由 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. )
复制代码

作者: iamstar    时间: 2011-12-31 00:42

正用到这部分,,学习了




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2