标题: 批处理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 变个方式来实现你的目的- @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
复制代码
作者: 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 标题: 楼主是不是要这样啊
- @echo off
- for %%i in (a b c d e) do echo %%i
- 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等于空的问题
你写的那个是错的- @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
- pause
- :aa
- for /f "tokens=%1 delims=;" %%i in (v.txt) do echo %%i
- if "%1"=="5" goto :end
- 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楼的也不对,这样也许会好些(我就不写入另外的文件了,其实是一样的):
- @echo off
- set "v=a;b;c;d;e"
- for /l %%a in (1 1 5) do call :aa %%a
- pause
- goto :eof
- :aa
- for /f "tokens=%1 delims=;" %%i in ("%v%") do (
- echo %%i
- )
复制代码
作者: iamstar 时间: 2011-12-31 00:42
正用到这部分,,学习了
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |