2016-10-14 21 views
2
for /f %%a in ('type "file.txt"^|find "" /v /c') do set /a count=%%a 

我发现这里http://www.dostips.com/?t=Snippets.CountLines为什么这个计算文本文件中行数的批处理命令起作用?

这个命令看来工作,但我想不出为什么。我不愿意使用我不明白的东西,除非它有特殊字符的错误等,但我无法弄清楚它为什么起作用。

+0

类型'find /?'从命令提示符下读取'/ v'和'/ c'开关的功能。 –

+0

你对批次的熟悉程度如何?如果我不必解释'for/f'循环的作用,答案会更小。 – SomethingDark

+0

展开命令。 '键入“c:\ windows \ win.ini”| find“”/ v/c' –

回答

6

内而外

  • type file.txt只需读取文件和输出它的内容到标准输出。

  • 在此代码中,type命令的输出被传送到find命令中。

  • find命令读取它的标准输入(无读取文件已经表示)和过滤器它,寻找不包含(/v)没有行(如果一个空字符串表示find将不匹配任何东西)。在过滤时,它将计算找到了多少行,并将仅输出匹配行数(/c)的标准流。由于空字符串与任何内容都不匹配,但/v开关将其取消,所以我们结束匹配(并计数)文件中的所有行。

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

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

:管道是一个特殊字符,里面包括它在for /f命令我们要逃避它(^|

  • 对于每个L ine(字符串,文件中的每一行或命令输出中的每一行)do子句中的代码被执行,正在处理的行(或其某些部分)存储在for可替换参数中(%%a此代码)

  • find命令(在该文件中的行数的输出)被存储在for /f替换参数,则执行do子句和线的文件中(数存储在所述可替换的参数)复制到环境变量中

noteset /a用于算术运算。在这种情况下没有必要使用一个简单的set命令来完成这项工作,但也许它是这样写的,以便使其更清楚,将存储在环境变量中的值是一个数字

+0

*“也许它是这样写的,使其更清晰”* - 是的,或者如果输出由于某种原因而不是数字,则强制它成为数字(0)。 – GolezTrol

+2

@GolezTrol,环境变量总是字符串,'/ a'只是调用一个单独的解析器来处理算术运算,这个代码中不存在的东西。我还没有看到一个'find/c'命令输出任何数字,你知道该怎么做吗? –

+0

是的,环境变量总是字符串,但是'set/a var = XYZ'会导致var变为'0'。所以你可以在这里像使用类型转换一样使用'/ a',保证var将包含一个'数字'(一个包含有效数字值的字符串),而不是文本值'XYZ',这可能会破坏下一步。它可以作为安全措施或作为一种更容易检查下一步结果的方式。通常它应该可以工作,但我可以想象,如果发生错误(文件不可读,网络超时等),'find'可能会返回其他内容。 – GolezTrol

相关问题