現有若干以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 )
然而運行時提示:系統找不到指定的文件。經過測試發現,當find命令的目標文件路徑中存在空格時,就會報出這樣的錯誤。而當前的文件目錄就是位於桌面,也就是“ 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來將命令執行結果賦給變量。