如何计算目录和子文件夹中的所有文本文件的行

时间:2016-12-07 19:35:53

标签: batch-file for-loop cmd window nested-loops

我试图在other question

中改进@Tony发布的脚本
  @Echo off
  Set _File=file.txt
  Set /a _Lines=0
  For /f %%j in ('Type %_File%^|Find "" /v /c') Do Set /a _Lines=%%j
  Echo %_File% has %_Lines% lines.

计算目录和子文件夹中所有文本文件的行:

  @Echo off
  setlocal EnableDelayedExpansion
  Set _Dir=C:\TEST_DIR\
  Set /a _Lines=0
  for /R %_Dir% %%f in (*.*) do (
    for /f %%j in ('Type !%%f!^|Find "" /v /c') Do Set /a _Lines=!_Lines!+!%%j!
  )
  Echo %_Dir% has %_Lines% lines.
  pause

但我发现错误:"缺少操作数。"

3 个答案:

答案 0 :(得分:0)

我的不好,我在句子中使用了额外的!!

Do Set /a _Lines=!_Lines!+!%%j!

这是工作代码:

@Echo off
Set _Dir=C:\TEST_DIR\
Set /a _Lines=0
for /R %_Dir% %%f in (*.*) do (
  for /f %%j in ('Find "" /v /c ^< "%%~f"') Do Set /a _Lines=_Lines+%%j
)
Echo %_File% has %_Lines% lines.
pause

[编辑]为@aschipfl sugested

答案 1 :(得分:-1)

您可以尝试这样:

@echo off
Title Scanning number of lines into files %Date% @ %Time%
Set LogFile=%~dp0nbLines.txt
If Exist "%LogFile%" Del "%LogFile%"
for /D %%d in (%tmp%) do (
    pushd %%d
    for %%X in (*.txt *.bat *.vbs *.hta) do (
        Call :Scanning "%%~X" 
        Call :CountLines "%%~X" "%LogFile%"
    )
    popd %%d
)
Start "" "%LogFile%"
Exit /b
::**************************************************************
:CountLines
set /a cnt=0
for /f %%a in ('type "%~1" ^|find "" /v /c') do set /a cnt=%%a
echo "%~1"  =======^>  %cnt% lines >>"%~2"
goto :eof
::**************************************************************
:Scanning <file>
mode con cols=70 lines=3
Cls & Color 0A
echo(
echo            Scanning for file "%~1" ...
goto :eof
::**************************************************************

答案 2 :(得分:-1)

我看到了一些问题。

首先,正如您刚刚在我输入时发现的那样,您获得了缺少的操作数,因为您在!%%j!上使用了延迟扩展,这是您不需要的。你也不需要Type !%%f!...。事实上,它实际上不会使用具有空格的文件。我建议将其更改为Type "%%~f"...以允许文件名中的空格。

通常,您可以使用echo查看命令的解释方式来发现这些问题。例如,重复此行,在echo之后插入Do。问题变得很明显。

for /f %%j in ('Type !%%f!^|Find "" /v /c') Do echo Set /a _Lines=!_Lines!+!%%j!

另外,请注意,如果在二进制文件上使用此选项,您可能会收到意外结果。考虑在*.*行中使用不同的文件掩码(或文件掩码集)而不是for /r。例如:

for /R %_Dir% %%f in (*.txt *.xml *.ini) do (