Board logo

标题: 新手浅谈批处理for /l %%i变量与%PATH:~*,1%的结合 [打印本页]

作者: rsent    时间: 2011-2-22 00:09     标题: 新手浅谈批处理for /l %%i变量与%PATH:~*,1%的结合

我想单独显示出%line%中的第一个,第二个,第三个,一直到 第100个字。(假设%line%有100个字)下面代码是
显示第一个,第二个,第三个。
  1. @echo off
  2. set line=abcdefg
  3. echo %line:~0,1% %line:~1,1% %line:~2,1%
  4. pause
复制代码
不想一直复制后再改数字,因为要改到100。%line:~*,1%.
所以就想到了 /f /l 命令。请看下面代码,意思是  在屏幕上显示 %line:~0,1% 到 %line:~100,1%
也就是单独显示%line%中的第一个,第二个到第一百个字。
可是dos不支持。
读取echo %line:~%%i,1%时,先读取了 echo %line:~% 所以显示%line%
  1. @echo off
  2. set line=abcdefg
  3. for /l %%i in (0,1,100) do (
  4. echo %line:~0,1%
  5. echo %line:~%%i,1%
  6. )
  7. pause
复制代码
又想到了 for /f 命令和变量延迟,觉得把%换成!应该有可能的。
经过运行,虽然 %%a%%b=line:~*,1  ,但是!%%a%%b!不等于%line:~*,1%
如何才能使for /l 与 %PATH:~*,1% 相结合?
难道是!和%相互冲突了,导致!%%a%%b!不被dos接受。
怎么才能只使用 !或 %的一个?或者怎么让dos接受?
最后我想到了一个办法!

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set line=abcdefg
  4. for /l %%i in (0,1,100) do (
  5. for /f "delims=[ tokens=1,2" %%a in ("!line:~[%%i,1!") do (
  6. echo %%a%%becho !%%a%%b!
  7. )
  8. )
  9. pause
复制代码


觉得for /f命令和  in ("!line:~[%%i,1!")  结合的不够深,导致最后的失败。
下面代码经过试验。完美的达到要求!!!
原理:    利用delims=空格,把 n ("!:~ %%i,1!")  中间的空格取消。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set line=abcdefg
  4. for /l %%i in (0,1,100) do (
  5. for /f "delims=  tokens=1,2" %%a in ("!line:~ %%i,1!") do (
  6. echo %%a%%b
  7. )
  8. )
  9. pause
复制代码
本文是为自己的另一篇文章做铺垫,为提取单独字数作准备。            http://www.bathome.net/thread-11139-1-1.html
本人技术有限,待以后学成后再修改补充。
如果讲述的观点有误,请指出。


很感谢caruko !
他说的很对,其实直接 !line:~%%i,1! 就可以得到结果了。


当时看到一屏幕的 “ECHO 处于关闭状态”  就以为行不通,没想到答案在最上面,白白浪费了时间。(当时开了延迟做的,写文章的时候没写上)

[ 本帖最后由 rsent 于 2011-2-22 02:11 编辑 ]
作者: caruko    时间: 2011-2-22 01:29

没看懂,你启用变量延迟,用!来调用变量是正确思路啊
但是为什么会出现 !%%a%%b! ?
直接下面这样就可以了啊
  1. for /l %%i in (0,1,100) do (
  2.     echo !line:~%%i,1!
  3. )
复制代码

作者: caruko    时间: 2011-2-22 01:40

有点明白你那个for /f的意思了
但是,既然你for /f 的用意是将%%i先转成数字,那么在for 的括号中根本无需!!来延迟变量。
那么只要下面这样就可以
  1. for /l %%i in (0,1,100) do (
  2.         for /f  "delims=*"  %%a in ("line:~%%i,1") do (
  3.                 echo %%a
  4.                 echo !%%a!
  5.         )
  6. )
复制代码


实际上,你的for /f 就相当于这样
  1. for /l %%i in (0,1,100) do (
  2.         set str=line:~%%i,1
  3.         echo !str!
  4. )
复制代码
其实直接 !line:~%%i,1! 就可以得到结果了。。
作者: wc726842270    时间: 2011-2-22 03:01

原帖由 rsent 于 2011-2-22 00:09 发表
我想单独显示出%line%中的第一个,第二个,第三个,一直到 第100个字。(假设%line%有100个字)下面代码是
显示第一个,第二个,第三个。@echo off
set line=abcdefg
echo %line:~0,1% %line:~1,1% %line:~2,1%
p ...

呵呵,如果一下全明白了,那我们学习干什么呢,论谈又有什么意义呢
作者: hanyeguxing    时间: 2011-2-22 09:38

基于楼主的目的,推荐在 for f 中套 for /l 。例如:
  1. for /f "delims="  %%a in (1.txt) do (
  2.     set a=%%a
  3.     for /l %%b in (1 1 100) do if not "!a:~%%b,1!"=="" echo;!a:~%%b,1!
  4. )
复制代码





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