【问题标题】:How to count lines all text file in a directory and subfolders如何计算目录和子文件夹中所有文本文件的行数
【发布时间】:2016-12-07 19:35:52
【问题描述】:

我正在尝试改进@Tony 在other question 中发布的脚本

  @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

但我收到错误:“缺少操作数。”

【问题讨论】:

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


    【解决方案1】:

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

    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 建议

    【讨论】:

    • Type !%%f! 没有任何意义,因为这会将%%f(一个迭代文件)的内容视为一个变量,由于周围的!! 会被扩展,这将最有可能导致空字符串;它应该是Type "%%~f"。或者,用Find "" /v /c ^&lt; "%%~f" 替换整个Type "%%~f"^|Find "" /v /c 部分(这是我实际上会这样做以避免管道|)。
    • 由于您不再使用延迟扩展,因此您不再需要启用它...
    【解决方案2】:

    我发现了一些问题。

    首先,正如您刚刚在我键入此内容时发现的那样,您得到了缺少的操作数,因为您在 !%%j! 上使用了延迟扩展,而您不需要。 Type !%%f!... 上也不需要它。事实上,它不适用于有空格的文件。我建议将其更改为 Type "%%~f"... 以允许文件名中包含空格。

    一般来说,您可以通过使用echo 来发现这些问题,以查看命令是如何被解释的。例如,复制这一行,在Do 之后插入一个echo。问题变得很明显。

    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 (
    

    【讨论】:

    • Set /a _Lines=!_Lines!+!%%j! 命令行中%%j 周围的感叹号也需要删除。将语法更改为Set /a _Lines=_Lines+%%j 甚至Set /a _Lines+=%%j 时,实际上可以避免延迟扩展...
    • 关于您的第一条评论,我们不是说同样的话吗?同意第二条评论。
    • 啊,是的,我读得不够仔细,抱歉……我真的不明白你为什么投了反对票……
    猜你喜欢
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2020-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多