我试图在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
但我发现错误:"缺少操作数。"
答案 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 (