Board logo

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

作者: xinfeng    时间: 2016-8-30 14:19     标题: 求教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
复制代码
多谢!
作者: Batcher    时间: 2016-8-30 18:00

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

参考教程:
http://bbs.bathome.net/thread-31727-1-1.html
作者: xinfeng    时间: 2016-8-31 15:34

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值时,已经循环结束了. 是这么理解吗?
多谢!
作者: GNU    时间: 2016-8-31 15:53

@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

你体会一下这个效果
作者: xinfeng    时间: 2016-8-31 16:07

回复 4# GNU

不赋初值直接用的变量,默认值为1?
你这个没解答我的疑惑啊....
还是多谢.
作者: GNU    时间: 2016-8-31 16:28

回复 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
复制代码
这样能解惑吗?
作者: xinfeng    时间: 2016-9-1 17:07

回复 6# GNU


    有点明白,还有点晕.
自定义变量 !i! 和 for循环的控制变量 %%i 是两个不同的东西
那后面怎么分别引用?就看用的是双叹号还是%%?
作者: happy886rr    时间: 2016-9-1 17:18

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

回复 7# xinfeng


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

如果仍有疑惑,请把你的代码和你想实现的目标分别发出来看看。
作者: xinfeng    时间: 2016-9-2 08:34

回复 8# happy886rr


    谢谢. 我的理解是for...do() 这个语句的do()括号里面的内容都属于循环体内. 不是这样的?
作者: xinfeng    时间: 2016-9-2 08:34

回复 9# GNU


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

回复 11# xinfeng


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

建议看看 for 命令教程吧
http://bbs.bathome.net/thread-31727-1-1.html
作者: xinfeng    时间: 2016-9-26 13:07

回复 12# GNU


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

回复 13# xinfeng


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

回复 14# GNU


    好吧, 引用方式不同,引用的变量也跟着不同,刚接触还有点难理解. 慢慢熟悉吧. 多谢了.
作者: idos    时间: 2016-9-27 21:41

回复 3# xinfeng


    谁告诉你C语言或者VB语言用手动增加变量值了,C语言也有循环,循环里变量值可以增加或者减少.......
作者: xinfeng    时间: 2016-9-29 15:01

回复 16# idos


    我的意思是,C里面必须显式地用i++之类的使变量变化.  但批处理不用啊
作者: winsfly    时间: 2016-9-29 17:26

  1. @echo off
  2. title 禁止关闭!!!
  3. mode con lines=1 cols=20
  4. REM 几十个供销商网站地址全部放到URL.txt里面,每行一个网址
  5. taskkill /f /im iexplore.exe
  6. for /f "tokens=1 delims=\" %%i in ('type "URL.txt"') do (
  7.     call :OpenURL "%%i"
  8. )
  9. goto :eof
  10. :OpenURL
  11. start "" "%systemdrive%\Program Files\Internet Explorer\iexplore.exe" %1
  12. :CheckProc
  13. tasklist /nh | find /i "iexplore.exe"
  14. if errorlevel 1 (
  15.     goto :eof
  16. ) else (
  17.     goto :CheckProc
  18. )
复制代码





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