现有若干以IP地址命名的文件,192.168.1.1.txt,192.168.1.2.txt等等等。。。需要统计每个文件中指定关键字所占的行数。这种重复性的字符查找工作用批处理来完成自然是再适合不过啦!整体思路很简单,使用for循环来遍历文件,使用find  /c命令来进行关键字的查找,然后将结果输出到另一个文件,内容格式为:ip:n。关键代码如下:

for %%i in (*.txt) do (
    find /c "keyword" %%i >> result.txt
)

 C:\Documents and Settings\Administrator\桌面\文件”,其中是有空格的。

  为了解决这个问题,我们可以使用for命令的扩展参数%%~si(详见for /?)来替代%%i,它可以使用一个不含空格的短路径来代替较长的文件路径(包括文件名)。OK,程序运行的很顺利,我们满怀期待的打开result.txt,看到如下内容:“----------D:\DESKTOP\193920~1.TXT: 2”(本文是在家用的win7系统上写的,桌面路径在D盘,但足以说明文件名的问题)。可以看到,使用find /c 对文件进行查找时,结果包含文件路径和行数。然而我们由于使用了短路径,以至于连文件名也被压缩了,我们无从分辨谁是谁了TAT。我们当然可以在find语句后面再使用echo %%ni来输出一个不带路径的标准文件名,但是这个文件名会写入到下一行;而且短路径不但没有用而且严重影响了结果的视觉效果和格式,如果我们想要把结果粘贴到ecxel中,就必须要手动把那些短路径删掉,然后把文件名和结果对齐,这还是很麻烦呀T T。目前的问题在于,使用find对文件进行查找时,输出的结果是格式固定且冗余的,即包含文件路径和行数,还有前面那一串横线。经测试发现,使用find对CMD中的内容进行查找时,输出结果只有行数。那么我们可以使用type命令把文件内容打印到CMD中然后重定向给find,这样就得到了统计出的行数;然后把这个值赋给一个变量,然后就可以把文件名和值输出到同一行。具体代码如下:

for %%i in (*.txt) do (
    for /f %%a in ('type %%~si ^|find /c "username"')do (
    set var=%%a
    echo %%~ni:!var! >> result.txt
    )  
)

第二个for的作用是把命令执行结果赋给变量var;括号内的命令需要用单引号括起来;%%a就是统计结果,即行数;^是转义字符。

啦啦啦,问题完美解决~

总结一下,本问题的解决过程有3个关键点:

1.使用for的扩展变量%%~si来解决find命令的目标路径中存在空格的问题;

2.将type结果重定向至find而不是直接对文件进行find来避免得到不相干的查找内容;

3.使用for来将命令执行结果赋给变量。