bat中for /f 如何截取任意行

一、概述

for命令开关有很多,/L,/F,/R。这里仅对含有/F的for进行分析,这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。

1.命令格式:
(1).FOR /F ["options"] %%i IN (file) DO command
(2).FOR /F ["options"] %%i IN ("string") DO command--注意双引号
(3).FOR /F ["options"] %%i IN (‘command‘) DO command--注意单引号

2.参数说明:

file代表一个或多个文件,可以使用通配符。
string 代表字符串
command代表命令
["options"]选项有多个:

eol=c           - 指定一个行注释字符,遇到c开头的行就忽略掉。
 skip=n          - 指定在文件开始时忽略的行数。
 delims=xxx      - 指定分隔符。默认是空格和TAB。

tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代
                   的 for 本身。这会导致额外变量名称的分配。m-n
                   格式为一个范围。通过 nth 符号指定 mth。如果
                   符号字符串中的最后一个字符星号,
                   那么额外的变量将在最后一个符号解析之后
                   分配并接受行的保留文本。
 usebackq        - 1.把单引号字符串作为命令;2.允许中使用双引号扩起文件名称。

二、详细介绍
1.FOR /F %%i IN (file) DO command
    file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取到内存,按照每一行为一个元素,忽略空白的行。
    假如文件d:\out.txt中有如下内容:

第1行第1列第1行第2列第1行第3列
  第2行第1列第2行第2列第2行第3列
  第3行第1列第3行第2列第3行第3列

怎么遍历文件中的内容呢?下面的语句可以:
for /f %%i in (d:\out.txt) do echo %%i

执行过程:for会先打开out.txt,然后读出out.txt里面的所有内容,把它作为一个集合,并且以每一行(文件中无分隔符情况下)作为一个元素,用%%i依次代替每个元素,然后执行do后面的命令。

for /f会默认以每一行(无分隔符)来作为一个元素,但是有分隔符怎么办?假如out.txt内容变成如下:

第1行第1列 第1行第2列 第1行第3列
  第2行第1列 第2行第2列 第2行第3列
  第3行第1列 第3行第2列 第3行第3列

那么for /f %%i in (d:\out.txt) do echo %%i就无法将所有的内容显示出来。显示结果如下:

第1行第1列
  第2行第1列
  第3行第1列

因为命令默认是以空格和TAB为分隔符,所以它遇到分割符之后,默认只取第一个,就将分割符后面的都丢掉了。

如果我们还想把每一行再分解更小的内容,该怎么办呢?for命令提供了更多的参数,它们就是:delims和tokens
delims :告诉for每一行应该拿什么作为分隔符,默认的分隔符是空格和tab键
比如,我们执行下面的命令:

for /f "delims= " %%i in (d:\out.txt) do echo %%i

显示的结果:

第1行第1列
第2行第1列
第3行第1列

这个命令和for /f %%i in (d:\out.txt) do echo %%i的效果是一样的。

如果我们想要每一行的后面的元素,那又如何呢?这个时候就可以利用tokens参数,它的作用就是当你通过delims将每一行分为更小的元素时,由tokens来控制要取哪一个或哪几个。
还是上面的例子,执行如下命令:

for /f "tokens=2 delims= " %%i in (d:\out.txt) do echo %%i

执行结果:

第1行第2列
第2行第2列
第3行第2列
如果要显示第二列和第三列,则换成tokens=2,3或tokens=2-3,全部显示则使用通配符tokens=*。

注意:如果显示多个元素(非*),比如这里的tokens=2-3,语句应该写成这样:

for /f "tokens=2,3 delims= " %%i in (d:\out.txt) do echo %%i %%j

怎么多出一个%%j?
这是因为你的tokens后面要取每一行的两列,用%%i来替换第二列,用%%j来替换第三列。
并且必须是按照英文字母顺序排列的,%%j不能换成%%k,因为i后面是j。
执行结果为:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

又如下面语句:

for /f "tokens=2,* delims= " %%i in (d:\out.txt) do echo %%i %%j
它显示从第二列到最后的一列,执行结果为:

第1行第2列 第1行第3列
第2行第2列 第2行第3列
第3行第2列 第3行第3列

用%%i代替第二列,用%%j代替剩余的所有。

最后还有skip,eol和usebackq。

skip就是要忽略文件的前多少行,eol用来指定当一行以什么符号开始时,就忽略它。比如:

for /f "skip=2 tokens=*" %%i in (d:\out.txt) do echo %%i
结果为:

第3行第1列 第3行第2列 第3行第3列
用skip来告诉for跳过前两行。

再如,当out.txt内容变成:

#第1行第1列 第1行第2列 第1行第3列
#第2行第1列 第2行第2列 第2行第3列
第3行第1列 第3行第2列 第3行第3列

for /f "eol=# tokens=*" %%i in (d:\out.txt) do echo %%i

结果是:

第3行第1列 第3行第2列 第3行第3列
用eol来告诉for忽略以“.”开头的行。

usebackq就是反转的意思,他把字符串("out.txt")当做文件,或者把命令(‘command‘)当做字符串。

例如:

for /f "usebackq eol=# tokens=*" %%i in ("d:\out.txt") do echo %%i

结果是:

第3行第1列 第3行第2列 第3行第3列

如果不加usebackq,则"d:\out.txt"会被当成字符串。

又例如:

for /f "usebackq tokens=*" %%i in (‘echo helloworld!‘) do echo %%i

结果:

echo helloworld,这里命令被当成了字符串。

如果没有usebackq

for /f "tokens=*" %%i in (‘echo helloworld!‘) do echo %%i

结果:

helloworld!

2.FOR /F ["options"] %%i IN ("string") DO command

例子:

for /f "tokens=2,* delims= " %%i in ("this is an example!") do echo %%i %%j

结果:

is an example!

对于字符串的处理类似于文件的处理,此处不再赘述。

3.FOR /F ["options"] %%i IN (‘command‘) DO command

该命令将command的执行结果作为集合,后面的处理类似文件处理,此处不再赘述。

方法1. 用find命令查找指定字符串


1

2

3

@Echo Off

For /f "delims=" %%i in (‘Type 1.txt^|Find "疑似"‘do (Echo %%i)

Pause

追问:

如果我根本不知道1.txt内容,只知道共四行,想单独显示第二行,该怎么写?

追答:


1

2

3

4

5

6

@Echo Off&Setlocal Enabledelayedexpansion

For /f "delims=" %%i in (1.txt) do (

Set /a n+=1 

If !n!==2 Echo %%i

)

Pause

只显示第二行

追问:

本人较为愚钝,没看懂,但能实现,谢谢。若能写个分别将1.txt中的2 4 6行内容分别赋给变量a b c 就再追加20分。谢谢

追答:


1

2

3

4

5

6

7

8

For /f "delims=" %%i in (1.txt) do (

Set /a n+=1 

If !n!==2 Set a=%%i

If !n!==4 Set b=%%i

If !n!==6 Set c=%%i

)

Echo %a% %b% %c%

Pause

时间: 2024-10-18 14:32:27

bat中for /f 如何截取任意行的相关文章

bat中的特殊字符,以及需要在bat中当做字符如何处理

批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set/a中表示按位取反. %\\使用两个%包含一个字符串表示引用环境变量.比如一个%time%可以扩展到当前的系统时间;单个%紧跟0-9的一个数字表示引用命令行参数:用于for中表示引用循环变量:连续的两个%表示执行时脱为一个%. ^\\取消转义字符,即将所有转义字符的转义作用关闭.比如要在屏幕显示一些

Bat 中特殊符号

批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set/a中表示按位取反. %\\使用两个%包含一个字符串表示引用环境变量.比如一个%time%可以扩展到当前的系统时间;单个%紧跟0-9的一个数字表示引用命令行参数:用于for中表示引用循环变量:连续的两个%表示执行时脱为一个%. ^\\取消转义字符,即将所有转义字符的转义作用关闭.比如要在屏幕显示一些

【分享】bat中处理字符串的方法

C语言中有各种处理字符串的函数,BAT中没有C语言那么强大,所以只能结合SET语句,做一些简单的字符串处理 首先看SET 命令的格式如下: 环境变量替换已如下增强:.     %PATH:str1=str2% 会扩展PATH 环境变量,用"str2" 代替扩展结果中的每个"str1". 要有效地从扩展结果中删除所有的"str1","str2" 可以是空的. "str1" 可以以星号打头:在这种情况下,&qu

【转】【bat】Bat 中特殊符号

批处理.Bat 中特殊符号的实际作用,Windows 批处理中特殊符号的作用: @\\隐藏命令的回显. ~\\在for中表示使用增强的变量扩展:在set中表示使用扩展环境变量指定位置的字符串:在set/a中表示按位取反. %\\使用两个%包含一个字符串表示引用环境变量.比如一个%time%可以扩展到当前的系统时间;单个%紧跟0-9的一个数字表示引用命令行参数:用于for中表示引用循环变量:连续的两个%表示执行时脱为一个%. ^\\取消转义字符,即将所有转义字符的转义作用关闭.比如要在屏幕显示一些

dat文件中如何编写DOS的多行命令

dat文件中如何编写DOS的多行命令 2012-10-15 11:29 四海柔情108 分享到: 2012-10-16 23:36 提问者采纳 你问的应该是BAT文件吧?BAT是DOS命令的批量运行方式,是顺序执行的单个命令.BAT可以使用任意文本编辑器编写,如:记事本.Word等等.在DOS环境中,可以使用命令行工具和EDIT编辑器进行编辑: 1. copy con abc.bat回车后开始逐行写命令,到最后一行的时候,按F6键,再回车,把书写的命令行保存为当前目录下的abc.bat文件. 2

bat中rar压缩命令

bat中rar压缩命令 数据库备份,导出的dmp 文件比较大,需要压缩,压缩后大小能变为原来十分之一左右吧. 写的是批处理的语句,每天调用,自动导出dmp 文件,压缩删除原文件. 首先写下路径,先将压缩软件的路径写入系统的环境变量里,加入到path中.比如将"C:\Program Files\WinRAR\"加入到path中. 之后批处理中写好相应的处理命令: rar a -df %filename%.rar %filename%.dmp 附: 压缩参数 用法:     rar <

在Visual Studio中入门F#

写在前面的话 个人由某方面的兴趣需要学习 F#,网络上有关F#的中文资料很少,微软官方有很不错的文档,但是很可惜的是绝大部分的章节都是英文的.个人是一位.NET爱好者,想自己将 F# 的官方文档翻译出来,算是为了自己喜欢的 .NET 做一些贡献. 原文链接 Getting started with F# in Visual Studio 在这篇文章中 安装 F# 创建一个控制台应用程序 编写您的代码 运行您的代码 使用 F# Interactive 在 Visual Studio IDE 中支持

【iOS面试系列-2】多线程中同步、异步和串行、并行之间的逻辑关系(必考,必须掌握)

一.同步.异步和串行.并行 任务串行执行就是每次只有一个任务被执行,任务并发执行就是在同一时间可以有多个任务被执行. 一个同步函数只在完成了它预定的任务后才返回.一个异步函数,刚好相反,会立即返回,预定的任务会完成但不会等它完成.因此,一个异步函数不会阻塞当前线程去执行下一个函数. (来源:http://www.cocoachina.com/industry/20140428/8248.html) 队列分为串行和并行 任务的执行分为同步和异步 -------  队列只是负责任务的调度,而不负责任

(译)如何在sql中选取每一组的第一行/最后行/前几行

转载请注明: TheViper http://www.cnblogs.com/TheViper  部分翻译自How to select the first/least/max row per group in SQL 一些常见的sql问题有着类似的解决方法,比如:查找每个程序最近的日志,查找每个商品分类中最受欢迎的商品,查找每个玩家的玩出的前5高分...这些问题可以被归纳为从各组中选出Top N. fruits表 选取每个分类中价格最低的行 步骤:1.找到要求的所需的值price.2.填充其他字