Board logo

标题: [文本处理] [已解决]批处理for /f语句怎样使tokens为变量? [打印本页]

作者: haitianguyan102    时间: 2010-11-15 17:01     标题: [已解决]批处理for /f语句怎样使tokens为变量?

我想创建文件名为1、2、3的三个内容不同的txt文件,
使用了如下代码
  1. @echo off
  2. for /l %%a in (1,1,3) do (
  3.       for /f "tokens=%%a" %%i in ("更无柳絮因风起 唯有葵花向日倾 有情芍药含春泪,无力蔷薇卧晓枝") do echo %%i >%%a.txt
  4. )
  5. pause
复制代码
结果显示
此时不应有 %a"。
此时不应有 %a"。
此时不应有 %a"。
请按任意键继续. . .


不知何故?怎样向tokens传递值呢?为什么提示的是不应有"%a"而不是双百分号"%%a"?

[ 本帖最后由 haitianguyan102 于 2010-11-15 18:55 编辑 ]
作者: FOR    时间: 2010-11-15 17:28

http://bbs.bathome.net/viewthrea ... Bfor%2B%C7%B6%CC%D7
作者: wc726842270    时间: 2010-11-15 17:43

LZ也可以外设一个变量,例如:
  1. set /p a=
  2. for "tokens=%a%" ……
复制代码
方式灵活多变,LZ可以自行尝试
作者: haitianguyan102    时间: 2010-11-15 18:54     标题: 原来在for和in之间的值不能为变量

谢谢 2楼,问题解决了
作者: hfg1977    时间: 2010-11-15 19:14

原来在for和in之间的值不能为变量

胡说八道, 可以使用.不要误导人
作者: haitianguyan102    时间: 2010-11-15 21:09     标题: 回复 5楼 的帖子

这也是高人说的,当然不包括"in"之前的%%i之类的,它只是对形式变量的引用。还有其它的也可以为变量么,愿闻高见
作者: zqz0012005    时间: 2010-11-15 22:24     标题: 回复 6楼 的帖子

哪个高人说的?你可以把他揪出来群殴。
我想很大可能是你自己理解有误(更可能是还没有到理解的程度)
作者: haitianguyan102    时间: 2010-11-15 22:55     标题: 回复 7楼 的帖子

呵呵 你看看2楼提供的这个连接就知道了
http://bbs.bathome.net/viewthrea ... Bfor%2B%C7%B6%CC%D7
是这个帖子里的2楼说的
作者: hfg1977    时间: 2010-11-15 23:08

不用 call 的形式, 而采用 %xx%的 形式也是可以的.
作者: cjiabing    时间: 2010-11-15 23:51

随风的原意可能是说不能这样写:“tokens=%%a”
tokens位于for和in之间,这之间只能有一个变量,这个变量是输入变量,和do后面的输出变量是统一一致的,不能有两个输入变量,更不能输入变量和输出变量前后不一致。
下面的写法是错误的:
1、输入变量和输出变量不一致:
  1. for %%a in (1) do echo %%i
复制代码
2、for和In之间同时存在两个“for形式的变量”——输入变量%%a和%%i,这是错误的:
  1. for %%a %%a in ("1111") do echo %%a
复制代码
如不将上一个for的变量%%a用SET转换成通用变量形式如 %var% 而直接在下一个for中使用是错误的,因为该for不晓得哪个才是当前正确的输入变量:
  1. for %%a in (1) do for /f   "tokens=%%a"   %%i  in  ("1 2 3 4") do echo %%i
复制代码
我忘记了是否存在特殊情况,也就是在for与in之间使用两个变量成立的情况,如果有似乎是以第一个作为当前for的变量的,且这个变量需与输出变量一致。(存疑)

[ 本帖最后由 cjiabing 于 2010-11-16 00:32 编辑 ]
作者: zqz0012005    时间: 2010-11-16 00:05     标题: 回复 8楼 的帖子

注意结合上下文理解,断章取义是不对的。

楼上给了解释。
作者: 随风    时间: 2010-11-16 01:15

这个问题以前讨论过,可能说的不太详细,以至使一些新手产生了误解。
for 中的 tokens=  和  delims= 后面的数字可以使用变量但只能是用 %% 引用的变量 如 %n%
也就是说无法在复合语句中直接引用即时变量(包括for 本身的变量 %%i 等。。)
看下面几个例子
:
  1. @echo off&setlocal enabledelayedexpansion
  2. set var=错误 正确
  3. set n=2
  4. for /f "tokens=%n%" %%a in ("%var%") do echo 第一个代码 %%a
  5. echo;
  6. for /l %%l in (1 1 2) do (
  7.    for /f "tokens=%n%" %%a in ("%var%") do echo 第二个代码 %%a
  8. )
  9. echo;
  10. echo;
  11. echo;
  12. ::错误的
  13. for /f "tokens=!n!" %%a in ("%var%") do echo %%a
  14. echo;
  15. for %%i in (2) do (
  16.    for /f "tokens=%%i" %%a in ("%var%") do echo %%a
  17. )
  18. pause
复制代码

作者: haitianguyan102    时间: 2010-11-16 18:23

原来如此,长知识了  谢谢诸位!
作者: wc726842270    时间: 2010-11-17 00:16

真是上火啊,给了解释,LZ也得试试啊,把问题弄了一圈,又回来了,
作者: iamstar    时间: 2011-12-31 00:42

正用到这部分,,学习了




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