我想计算文本文件中的行号,然后将值存储到环境变量中。计算行数的命令是
findstr /R /N "^" file.txt | find /C ":"
我提到问题How to store the result of a command expression in a variable using bat scripts? 然后我试了,
set cmd="findstr /R /N "^" file.txt | find /C ":" "
我收到错误消息
FIND: Parameter format not correct
我怎么能摆脱这个错误。
答案 0 :(得分:87)
有一种比所有其他方法更简单的方法。
find /v /c "" filename.ext
显然是从传统的MS-DOS时代的保留。更多信息:https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803
使用示例:
adb shell pm list packages | find /v /c ""
如果您的Android设备已连接到您的PC并且您的路径上有Android SDK,则会打印出您设备上安装的应用程序数量。
答案 1 :(得分:34)
您可以使用FOR / F循环将输出分配给变量。
我使用cmd-variable
,因此不需要转义cmd-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%
答案 2 :(得分:16)
受到之前帖子的启发, 一个较短的方法:
CMD.exe
C:\>FINDSTR /R /N "^.*$" file.txt | FIND /C ":"
行数
试试吧。它可以在我的控制台中使用。
(删除" $"符号)
FINDSTR /R /N "^.*" file.txt | FIND /C ":"
$将数字减少1,因为它接受第一行作为字段名称,然后计算行数。
答案 3 :(得分:9)
试试这个:
@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的重定向建议。删除TYPE
命令会使其快三倍。
答案 4 :(得分:4)
@Tony:你甚至可以摆脱type %file%
命令。
for /f "tokens=2 delims=:" %%a in ('find /c /v "" %_file%') do set /a _Lines=%%a
对于长文件,这应该更快。
答案 5 :(得分:4)
我通常使用更像这样的东西
for /f %%a in (%_file%) do (set /a Lines+=1)
答案 6 :(得分:3)
for /f "usebackq" %A in (`TYPE c:\temp\file.txt ^| find /v /c "" `) do set numlines=%A
在批处理文件中,使用%% A代替%A
答案 7 :(得分:3)
您不需要使用find。
@echo off
set /a counter=0
for /f %%a in (filename) do set /a counter+=1
echo Number of lines: %counter%
这将迭代文件中的所有行,并为每行增加1的计数器变量。
答案 8 :(得分:2)
我发现这个解决方案最适合创建一个自我维护的日志文件:
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
包含的环境变量是%clientname%远程客户端的计算机名%%Date%是当前日期,%Time%是当前时间。 :获取文件中的行数后调用NEXT。如果文件行数大于%maxlines%变量,则转到:EXITLOOP,它覆盖文件,创建一个带有第一行信息的新文件。如果它小于%maxlines%变量,它只是将该行添加到当前文件。
答案 9 :(得分:1)
只是:
c:\>(for /r %f in (*.java) do @type %f ) | find /c /v ""
字体:https://superuser.com/questions/959036/what-is-the-windows-equivalent-of-wc-l
答案 10 :(得分:0)
在下面的代码中,变量名称为SalaryCount
和TaxCount
@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
答案 11 :(得分:0)
您可以在type
循环的find
子句中将in(…)
的输出传递到for /f
:
for /f %%A in ('
type "%~dpf1" ^| find /c /v ""
') do set "lineCount=%%A"
但是管道启动了一个子壳,这会减慢速度。
或者,您可以将文件中的输入重定向到find
,如下所示:
for /f %%A in ('
find /c /v "" ^< "%~dpf1"
') do set "lineCount=%%A"
但是如果文件以一个或多个空行结尾,这种方法会给你一个比实际行数少1的答案,正如foxidrive中已故的counting lines in a file所说明的那样。
然后,你可以一直尝试:
find /c /v "" example.txt
麻烦的是,上面命令的输出如下所示:
---------- EXAMPLE.TXT: 511
您可以在冒号上拆分字符串以获取计数,但如果文件名具有完整路径,则可能有多个冒号。
这是我对这个问题的看法:
for /f "delims=" %%A in ('
find /c /v "" "%~1"
') do for %%B in (%%A) do set "lineCount=%%B"
这将始终将计数存储在变量中。
最后一个小问题...... find
将空字符视为换行符。因此,如果偷偷摸摸的空值悄悄进入您的文本文件,或者如果您想计算Unicode文件中的行数,那么这个答案不适合您。
答案 12 :(得分:0)
一个令人惊奇的惊喜是,他的Windows上有git bash
:只有普通的旧Linux wc -l <filename>
会为您服务
答案 13 :(得分:0)
你也可以试试
sudo apt-get install -y pkg-config
sudo apt-get update
sudo apt install gcc
sudo apt-get install tcl
sudo make distclean
sudo make
答案 14 :(得分:-1)
完美的解决方案是:
FOR /F %%i IN ('TYPE "Text file.txt" ^| FIND /C /V ""') DO SET Lines=%%i
答案 15 :(得分:-1)
您也可以用通配符*标记,以方便组文件计数。
Z:\SQLData>find /c /v "" FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_*.txt
结果
---------- FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_AVIFRS01_V1.TXT:2041
---------- FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_AVIOST00_V1.TXT:315938
---------- FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_AVIFRS00_V1.TXT:0
---------- FR_OP133_OCCURENCES_COUNT_PER_DOCUMENTS_CNTPTF00_V1.TXT:277