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

[文本处理] 求教for命令如何读取文本指定行及变量的使用方式

本帖最后由 xinfeng 于 2016-8-31 15:37 编辑

用for 打开文本里网址列表时的问题
在1.txt里有三行,三个网址.码如下:
  1. @echo off
  2. for /f "delims=" %%i in (1.txt) do (
  3. start "" "D:\Program Files\firefox\firefox.exe" %%i
  4. ::set /a i=%i%+1
  5. echo %%i
  6. ping -n 3 127.1>nul
  7. )
  8. pause
复制代码
运行后输出:
http://www.baidu.com
http://www.sina.com
http://www.163.com
Press any key to continue . . .
且能正确打开网页.

我的疑问:
1)如果我只想打开新浪, 把第二行改为: for /f "tokens=2 delims=" %%i in (1.txt) do (   结果什么都打不开.为何?
2)第四行  ::set /a i=%i%+1 ,这一行好像不起作用啊,加不加双冒号,效果一样?批处理的for 循环不用手动到下一个的?
3)echo %%i 这个, %%i,%i%,%i,到现在还是一头雾水.这里为什么不能写成%i%? 为什么下面这一小段用来从TIME 中取当前时间(精确到秒)的代码里,用的是%k% ?
  1. @echo off
  2.   for /f "tokens=5 delims= " %%i in (2.txt) do (set j=%%i)
  3.   set k=%j:~,8%
  4.   echo %k%
  5.   pause
复制代码
多谢!

1) tokens=2 表示获取第二列,而不是第二行
2) ::表示注释,另外这个 set /a 命令在此代码中没有任何作用,可以删掉
3) for 命令的控制变量用 %%i,其它普通变量用 %k%

参考教程:
http://bbs.bathome.net/thread-31727-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

1) tokens=2 表示获取第二列,而不是第二行
2) ::表示注释,另外这个 set /a 命令在此代码中没有任何作用, ...
Batcher 发表于 2016-8-30 18:00


2) ::表注释我知道,我的疑惑是,让这一行生效时,即去掉:: 后, set /a为何没有作用? For 循环里不用像vb或c语言中手动让变量增加以进行下一次循环吗?
3) echo %%i 是因为在for 循环的do()括号内部,所以用%%i, 后面那一段用echo %k%, 是因为读k值时,已经循环结束了. 是这么理解吗?
多谢!
1

评分人数

    • pcl_test: 指定回应某楼层的在相应楼层点回复,少引用PB -1

TOP

@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in (1.txt) do (
    start "" "D:\Program Files\firefox\firefox.exe" %%i
    set /a n+=1
    echo Number: !n!

    echo %%i
    ping -n 3 127.1 >nul
)
pause

你体会一下这个效果

TOP

回复 4# GNU

不赋初值直接用的变量,默认值为1?
你这个没解答我的疑惑啊....
还是多谢.

TOP

回复 5# xinfeng
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in (1.txt) do (
  4.     start "" "D:\Program Files\firefox\firefox.exe" %%i
  5.     set /a i+=1
  6.     echo Number: !i!
  7.     REM 自定义变量 !i! 和 for循环的控制变量 %%i 是两个不同的东西
  8.     echo %%i
  9.     ping -n 3 127.1 >nul
  10. )
  11. pause
复制代码
这样能解惑吗?

TOP

回复 6# GNU


    有点明白,还有点晕.
自定义变量 !i! 和 for循环的控制变量 %%i 是两个不同的东西
那后面怎么分别引用?就看用的是双叹号还是%%?

TOP

回复 7# xinfeng
%%i的生命只在for循环里存在,出了for循环,%%i这个变量就不存在了,而!i!是全局变量,会一直存在下去。注意每个变量的生命周期,在它活着的时候引用。

TOP

回复 7# xinfeng


你3楼已经说了,%%i只能在for循环内部使用,不能直接在for循环外部引用。
!i!作为普通的自定义变量,可以在for循环外部引用。

如果仍有疑惑,请把你的代码和你想实现的目标分别发出来看看。

TOP

回复 8# happy886rr


    谢谢. 我的理解是for...do() 这个语句的do()括号里面的内容都属于循环体内. 不是这样的?

TOP

回复 9# GNU


    代码就是主楼那段, 要实现的是把一个文档内的网址按行依次打开.
你用!i!的时候,是在for...do() 这个语句的do()括号里面, 这时就不算for循环了吗?我的理解是整个括号里的内容都是循环体内.

TOP

回复 11# xinfeng


是的,整个括号里的内容都是循环体内。
对的,批处理的 for 循环不用手动到下一个的。因此代码里面 set /a i+=1 没有任何意义

建议看看 for 命令教程吧
http://bbs.bathome.net/thread-31727-1-1.html

TOP

回复 12# GNU


    REM 自定义变量 !i! 和 for循环的控制变量 %%i 是两个不同的东西
既然在括号内的都算for循环, 那不就在一个循环内有两个变量 i 了吗?一个通过%%引用,一个用!!引用.
那个帮助文档看过,没解释的这么细.

TOP

回复 13# xinfeng


对的,两个变量i,通过不同的方式引用会得到不同的值。
教程这东西吧,每隔一段时间复习一遍,总会有不同的体会和收获。

TOP

回复 14# GNU


    好吧, 引用方式不同,引用的变量也跟着不同,刚接触还有点难理解. 慢慢熟悉吧. 多谢了.

TOP

返回列表