[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

批处理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.



还是不行啊,快来帮帮我吧,高手们!

嵌套中for的in前面部分不能使用变量
技术问题请到论坛发帖求助!

TOP

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

TOP

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

TOP

楼主是不是要这样啊

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

[ 本帖最后由 zw19750516 于 2008-6-18 13:30 编辑 ]
***共同提高***

TOP

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

个人见解,错了请原谅

TOP

不知道是不是这个意思

@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

TOP

大家可以试一下,7楼是对的,我的那个也错了,大家可以运行一下,我就不截图了,case closed,感谢大家!

TOP

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

TOP

正用到这部分,,学习了
此人已死,有事烧纸。------亡灵物语

TOP

返回列表