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

新手浅谈批处理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 编辑 ]
宝贵的光阴,总是像箭一样地飞逝着。

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

TOP

有点明白你那个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! 就可以得到结果了。。

TOP

原帖由 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 ...

呵呵,如果一下全明白了,那我们学习干什么呢,论谈又有什么意义呢
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

基于楼主的目的,推荐在 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. )
复制代码
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

返回列表