for /f %%a in ('type "file.txt"^|find "" /v /c') do set /a count=%%a
我发现这里http://www.dostips.com/?t=Snippets.CountLines为什么这个计算文本文件中行数的批处理命令起作用?
这个命令看来工作,但我想不出为什么。我不愿意使用我不明白的东西,除非它有特殊字符的错误等,但我无法弄清楚它为什么起作用。
for /f %%a in ('type "file.txt"^|find "" /v /c') do set /a count=%%a
我发现这里http://www.dostips.com/?t=Snippets.CountLines为什么这个计算文本文件中行数的批处理命令起作用?
这个命令看来工作,但我想不出为什么。我不愿意使用我不明白的东西,除非它有特殊字符的错误等,但我无法弄清楚它为什么起作用。
内而外
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
子句和线的文件中(数存储在所述可替换的参数)复制到环境变量中
note:set /a
用于算术运算。在这种情况下没有必要使用一个简单的set
命令来完成这项工作,但也许它是这样写的,以便使其更清楚,将存储在环境变量中的值是一个数字
*“也许它是这样写的,使其更清晰”* - 是的,或者如果输出由于某种原因而不是数字,则强制它成为数字(0)。 – GolezTrol
@GolezTrol,环境变量总是字符串,'/ a'只是调用一个单独的解析器来处理算术运算,这个代码中不存在的东西。我还没有看到一个'find/c'命令输出任何数字,你知道该怎么做吗? –
是的,环境变量总是字符串,但是'set/a var = XYZ'会导致var变为'0'。所以你可以在这里像使用类型转换一样使用'/ a',保证var将包含一个'数字'(一个包含有效数字值的字符串),而不是文本值'XYZ',这可能会破坏下一步。它可以作为安全措施或作为一种更容易检查下一步结果的方式。通常它应该可以工作,但我可以想象,如果发生错误(文件不可读,网络超时等),'find'可能会返回其他内容。 – GolezTrol
类型'find /?'从命令提示符下读取'/ v'和'/ c'开关的功能。 –
你对批次的熟悉程度如何?如果我不必解释'for/f'循环的作用,答案会更小。 – SomethingDark
展开命令。 '键入“c:\ windows \ win.ini”| find“”/ v/c' –