我想计算给定目录中每个文本文件的行数,并将它们存储在变量中。
这是我的代码:
@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
我需要将结果存储在变量中。
答案 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.txt
,find /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()
一样进行转义。