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

[系统相关] 【已解决】批处理for语句中tokens如何动态引用

代码如下:
@echo off
set n=
if exist c:\format.txt set n=1
if exist d:\format.txt set n=2
cd.>abc.txt
>>abc.txt echo c d e f g h i j k l m n o p q r s t u v w x y z
for /l %%i in (1,1,%n%) do (set m=%%i&for /f "tokens=%m%" %%j in (abc.txt) do set o=%%j&label %o%: <Format.txt)

对不起,忘记把abc文件内容帖出来了,SORRY!

[ 本帖最后由 NeverOK 于 2009-5-7 21:00 编辑 ]
1

评分人数

    • Batcher: 感谢主动给标题标注[已解决]字样PB + 2

自己先顶一下

由于 %m% 只能使用最后一次 %n% 使用的变量内容,比如%n%包含一维数组(1234), %m% 只能使用最后一个4,为什么呢?

TOP

for循环内的即时性变量需要开启变量延缓扩展

for 的options参数应该是在命令行载入时初始化的,不会动态扩展建议如下处理
  1. :@echo off
  2. Setlocal EnableDelayedExpansion
  3. if exist c:\format.txt set n=1
  4. if exist d:\format.txt set n=2
  5. >abc.txt echo c d e f g h i j k l m n o p q r s t u v w x y z
  6. for /l %%i in (1,1,1) do (
  7. set m=%%i
  8. ::以下为三种调用,第一种不需要开启setlocal扩展,第二种需要,第三种不仅不需要开启setlocal,也不用建立新变量m
  9. call :fff %%m%%
  10. call :fff !m!
  11. call :fff %%i
  12. )
  13. pause
  14. goto :eof
  15. :fff
  16. for /f "tokens=%1" %%j in (abc.txt) do echo set o=%%j^&label !o!:<format.txt
复制代码
1

评分人数

TOP

问题已经解决,非常感谢 everest79 哥们的帮忙,谢谢!

现在又遇到一个问题,看楼下:

[ 本帖最后由 NeverOK 于 2009-5-7 19:53 编辑 ]

TOP

同志们:还有个问题

这个语句必须在一条语句内完成(不能象 CALL :fff %%i 这样调用),大家能帮帮我吗?

这个语句不能在一条语句内完成吗?
如:
for /l %%i in (1,1,%n%) do (set m=%%i&for /f "tokens=%m%" %%j in (abc.txt) do set o=%%j&label %o%: <Format.txt)

[ 本帖最后由 NeverOK 于 2009-5-7 19:54 编辑 ]

TOP

不明白楼主为什么非要做批处理做不到的事,也不知道些题有何意义?
但是这个问题是可以一句完成,不过要换种方法:
for /f "tokens=*" %%a in (abc.txt) do for %%b in (%%a) do set/a m+=1&if !m! leq !n! (label %%b:<format.txt) else (goto k)
:ok

TOP

6楼同志,你好!
是这样的.
假如象2楼同志那样的语句执行的话,在:fff里面必须加上goto语句以表示结束让后面的代码能顺利运行.
就不能顺利更改所有盘符的卷标(因goto语句不让其他的for执行完毕).

那么还有一个变通的方法
把 call :fff %%i
改为:  call 111.bat %%1
那么只要把:fff内的语句写到111.bat里面了
问题出来了,执行完111.bat,就停顿在这里了
所以.............
我郁闷ing
现在我测试你给出的代码.非常感谢你!!!!!!!!

TOP

...
  1. if exist .....
  2. ...................
  3. for /f ...............(
  4. .......................
  5. call :fff am1
  6. )
  7. ...............................
  8. .........................
  9. ....................
  10. goto :eof
  11. :fff
  12. ......................
  13. goto :eof
复制代码

TOP

感谢两位

已经解决,感谢大家帮助.

主要还是我没经验,谢谢大家的帮助.还是使用 everest79 哥们的语句完成了这个任务,在此感谢 everest79

netbenton哥们给的语句思路特别好,我之所以用everest79的语句就是想避开
for %%a in (c d e f g h i j k l m n o p q r s t u v w x y z) do label %%a: <format.txt
出现那些特别多的提示.netbenton哥们的语句就会提示

再次感谢两位.-----------------结帖

TOP

解决办法

echo off
Setlocal EnableDelayedExpansion

if exist c:\format.txt set n=1
if exist d:\format.txt set n=2
>abc.txt echo c d e f g h i j k l m n o p q r s t u v w x y z
for /l %%i in (1,1,1) do (
set m=%%i

::以下为三种调用,第一种不需要开启setlocal扩展,第二种需要,第三种不仅不需要开启setlocal,也不用建立新变量m
call :fff %%m%%

call :fff !m!

call :fff %%i

)


pause
goto :eof



:fff
for /f "tokens=%1" %%j in (abc.txt) do echo set o=%%j^&label !o!:<format.txt
goto :eof

TOP

返回列表