这个是以前就遇到过的问题,其实方法是有很多种的
思路一:用findstr
利用findstr的/n功能,让每行前都显示个行号,然后用for分段读取,到指定行就显示出来
- @echo off
- for /f "tokens=1,2* delims=:" %%a in ('findstr /n . a.txt') do if %%a==3 echo %%b
- pause
复制代码
缺陷:空行的话findstr是不显示的,反正是空行,显示了别人也不知道
思路二:用变量储存行数
利用变量,每处理一行就增加1,到行数就显示
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (a.txt) do (
- set /a line+=1
- if !line!==3 echo %%a
- )
- pause
复制代码
缺点:用了变量延迟,不过也可以随时关闭掉
思路三:用more或for跳过行数
利用more的跳过行数来跳过前两行,然后显示完第三行就跳出for
- @echo off
- for /f "delims=" %%a in ('more a.txt +2') do echo %%a&goto end
- :end
- pause
复制代码
类同,用for的skip功能跳过前两行,然后显示完第三行就跳出for
- @echo off
- for /f "skip=2 delims=" %%a in (a.txt) do echo %%a&goto end
- :end
- pause
复制代码
缺点:多用了一个标签,不过不伤大雅
思路四:利用set /p配合more
先利用more把前两行过滤掉保存到tmp.txt,然后再用set /p保存到变量内容中,最后删除临时文件tmp.txt
- @echo off
- more a.txt +2>tmp.txt
- set /p a=<tmp.txt
- echo %a%
- del /q tmp.txt
- pause
复制代码
缺点:临时文件,给人厌恶感
这么多种方法中,方法一和方法二是最普通的,而且扩展一下,可以把每一行的内容都保存到变量中,要用的时候就可以直接用变量,省去了读取的时间
方法三可拓展性极低,只能单纯的解决问题,多次读取要浪费时间。不过方法三的第二种(用for的skip跳行数)读取几乎不需要时间,因此每次读取也不感觉停顿
方法四纯粹无理取闹,没有特殊情况用前三种就可以了 |