计算给定目录中每个文本文件的行数,并将其存储在变量中

时间:2015-11-24 11:00:58

标签: windows batch-file cmd

我想计算给定目录中每个文本文件的行数,并将它们存储在变量中。

这是我的代码:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /R "temp\textpipe_tmp\" %%U in (*.txt) DO (
    set "cmd=findstr /R /N "^^" "%%U" | find /C ":""
    for /f %%a in ('!cmd!') do set number=%%a
    echo %number%
)

:eof
pause

我不确定为什么它不起作用,但如果我摆脱SET,它就有效:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION

FOR /R "temp\textpipe_tmp\" %%U in (*.txt) DO (
    findstr /R /N "^" "%%U" | find /C ":"
)

:eof
pause

我需要将结果存储在变量中。

2 个答案:

答案 0 :(得分:1)

另一个版本,它做同样的事情,但稍微好一点:

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
FOR /R "C:\Users\Gebruiker\Documents\ICT" %%U in (*.txt) DO (
    set lines=0
    for /f  %%A in (%%U) do (set /a lines+=1)
    echo !lines!
)
pause

答案 1 :(得分:0)

正如@wOxxOm在comment中所述,find是完成此任务的最佳选择。

假设有一个包含12行的文件test.txtfind /V /C "" "C:test.txt"将输出如下内容:

---------- C:TEST.TXT: 12

因此,让我们使用for /F循环捕获此类输出和字符串替换,以获取: SPACE 之后的文本部分:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /R "temp\textpipe_tmp\" %%U in ("*.txt") do (
    rem capturing the output of `find` here:
    for /F "delims=" %%A in ('find /V /C "" "%%~U"') do (
        set "NUMBER=%%~A"
        rem substituting substring `: ` and everything before by nothing:
        set "NUMBER=!NUMBER:*: =!"
    )
    rem at this point, variable `NUMBER` is available
    rem for the currently processed file in `%%~U`:
    echo !NUMBER!
)
endlocal

请注意,如果文件的 end 处有空行,find /V /C ""将返回意外的reslts(其中一行可能不包含在计数中)。但是,将计算开头或非空行之间的空行。

更新

使用> "C:test.txt" find /V /C ""而非find /V /C "" "C:test.txt"之类的重定向可以避免使用前缀---------- C:TEST.TXT:,只返回行数(例如12)。通过此修改,不需要字符串替换,因此代码如下所示:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /R "temp\textpipe_tmp\" %%U in ("*.txt") do (
    rem capturing the output of `find` here:
    for /F "delims=" %%A in ('^> "%%~U" find /V /C ""') do (
        set "NUMBER=%%~A"
    )
    rem at this point, variable `NUMBER` is available
    rem for the currently processed file in `%%~U`:
    echo !NUMBER!
)
endlocal

重定向标记<^< in for /F之后使用时需要像subprocess.check_call()一样进行转义。