如何计算文本文件中的行数,并使用批处理脚本将值存储到variables中?

我想计算文本文件中的行数,然后将该值存储到环境variables中。 计数行号的命令是

 findstr / R / N“^”file.txt |  find / C“:”

我提到的问题如何使用蝙蝠脚本将命令expression式的结果存储在variables中? 然后我试了一下,

 set cmd =“findstr / R / N”^“file.txt | find / C”:“”

我收到错误消息,

 FIND:参数格式不正确

我怎么能摆脱这个错误。

您可以使用FOR / F循环将输出分配给一个variables。

我使用了cmd-variable ,所以不需要在cmd-string中转义pipe道或其他字符,因为延迟的扩展将string“不变”传递给FOR-Loop。

 @echo off cls setlocal EnableDelayedExpansion set "cmd=findstr /R /N "^^" file.txt | find /C ":"" for /f %%a in ('!cmd!') do set number=%%a echo %number% 

比其他所有方法都要简单得多。

 find /v /c "" filename.ext 

显然,从传统的MS-DOS时代延缓。 更多信息在这里: http : //blogs.msdn.com/b/oldnewthing/archive/2011/08/25/10200026.aspx

使用示例:

 adb shell pm list packages | find /v /c "" 

如果您的Android设备连接到您的电脑,并且您的path上有android SDK,则会打印出设备上安装的应用程序的数量。

受以前的post的启发,这样做的一个更短的方法:

 CMD.exe C:\>FINDSTR /R /N "^.*$" file.txt | FIND /C ":" 

行数

尝试一下。 它在我的控制台中工作。

编辑:

(“$”符号被删除)

 FINDSTR /R /N "^.*" file.txt | FIND /C ":" 

$将数字减1,因为它接受第一行作为字段名称,然后计算行数。

尝试这个:

 @Echo off Set _File=file.txt Set /a _Lines=0 For /f %%j in ('Find "" /v /c ^< %_File%') Do Set /a _Lines=%%j Echo %_File% has %_Lines% lines. 

它消除了额外的FindStr,不需要扩展。


– 编辑使用ChrisJJ的redirectbuild议。 删除TYPE命令使其快三倍。

@Tony:你甚至可以摆脱type %file%命令的type %file%

 for /f "tokens=2 delims=:" %%a in ('find /c /v "" %_file%') do set /a _Lines=%%a 

对于长文件,这应该更快。

我通常for /f %%a in (%_file%) do (set /a Lines+=1)使用更多类似的内容for /f %%a in (%_file%) do (set /a Lines+=1)

我发现这个解决scheme最适合创build一个维护自己的日志文件:

 setlocal enabledelayedexpansion SET /A maxlines= 10 set "cmd=findstr /R /N "^^" "filename.txt" | find /C ":"" for /f %%a in ('!cmd!') do set linecount=%%a GOTO NEXT :NEXT FOR /F %%A IN ("filename.txt") DO ( IF %linecount% GEQ %maxlines% GOTO ExitLoop echo %clientname% %Date% %Time% >> "filename.txt") EXIT :ExitLoop echo %clientname% %Date% %Time% > "filename.txt" EXIT 

包括的环境variables是%clientname%远程客户端的计算机名称%Date%是当前date和%Time%当前时间。 :获取文件中的行数后调用NEXT。 如果文件行数大于%maxlines%variables,则它将转到:EXITLOOP,覆盖文件,用第一行信息创build一个新文件。 如果它小于%maxlines%variables,它只是将该行添加到当前文件。

在下面的代码中,variables名称是SalaryCountTaxCount

 @ECHO OFF echo Process started, please wait... for /f %%C in ('Find /V /C "" ^< "D:\Trial\Salary.txt"') do set SalaryCount=%%C echo Salary,%SalaryCount% for /f %%C in ('Find /V /C "" ^< "D:\Trial\Tax.txt"') do set TaxCount=%%C echo Tax,%TaxCount% 

现在,如果您需要将这些值输出到csv文件,您可以使用下面的代码。

 @ECHO OFF cd "D:\CSVOutputPath\" echo Process started, please wait... echo FILENAME,FILECOUNT> SUMMARY.csv for /f %%C in ('Find /V /C "" ^< "D:\Trial\Salary.txt"') do set Count=%%C echo Salary,%Count%>> SUMMARY.csv for /f %%C in ('Find /V /C "" ^< "D:\Trial\Tax.txt"') do set Count=%%C echo Tax,%Count%>> SUMMARY.csv 

>将覆盖文件的现有内容,“ >>将把新数据附加到现有数据。 CSV将在D:\ CSVOutputPath中生成

 (`TYPE c:\ temp \ file.txt ^ | find / v / c“”```````设置numlines =%A 

在batch file中,使用%% A而不是%A