为什么这个计算文本文件中行数的批处理命令有效?

时间:2016-10-14 19:48:49

标签: batch-file

for /f %%a in ('type "file.txt"^|find "" /v /c') do set /a count=%%a

我在http://www.dostips.com/?t=Snippets.CountLines

找到了这个命令

它似乎有用,但我无法弄清楚原因。我不愿意使用我不理解的东西,除非它有特殊字符等的错误但我无法弄清楚它为什么会起作用。

1 个答案:

答案 0 :(得分:6)

由内而外

  • type file.txt只需读取文件并将其内容输出到标准输出。

  • 在此代码中,type命令的输出通过管道输入find命令。

  • find命令读取标准输入(未指示要读取的文件)并对其进行过滤,搜索不包含(/v)的行({{1}如果指示空字符串,则不会匹配任何内容)。在过滤时,它将计算找到多少行,并将仅输出匹配行数(find)到标准流。由于空字符串不匹配,但/c开关否定它,我们结束匹配(并计算)文件中的所有行。

  • 使用/v命令执行前两个管道命令。 for /f用于处理字符串,读取文件内容或执行命令并处理其输出。

note :默认情况下,要执行的命令用for /f命令的in子句中的单引号括起来

note :管道是一个特殊字符,要将它包含在for /f命令中,我们需要将其转义(for /f

  • 对于每一行(字符串,文件内的每一行或命令输出中的每一行),执行^|子句中的代码,并处理该行(或某些部分)它存储在do可替换参数(此代码中为for

  • %%a命令的输出(文件中的行数)存储在find可替换参数中,执行for /f子句且数量为文件中的行(存储在可替换参数中)被复制到环境变量

note do用于算术运算。在这种情况下没有必要,并且一个简单的set /a命令应该完成工作,但也许这样写是为了更清楚地表明将存储在环境变量中的值是一个数字