2014-02-11 2 views
4

Это мой скрипт, то, что он делает, - это подсчет строк из cpp, h, hpp, cs, c файлов в текущей папке.Batch - подсчет строк в файлах в текущей папке и вложенных папках

То, что я хочу сделать, также подсчитывается в подпапках, но, похоже, я не могу этого сделать.

Я сделал несколько попыток рекурсии, но я не могу реализовать его в текущем коде.

call::CountLines Modules\Output\HTML.Tidy\ 
goto:eof 

:CountLines 
setlocal 
set /a totalNumLines = 0 
SETLOCAL ENABLEDELAYEDEXPANSION 
for /r %%f in (%~1*.cpp %~1*.h %~1*.hpp %~1*.cs %~1*.c) do (
for /f %%C in ('Find /V /C "" ^< %%f') do set Count=%%C 
set /a totalNumLines+=!Count! 
) 

echo Total number of cod lines for %~1: %totalNumLines% >> log.txt 

Пожалуйста, дайте мне знать, если вы знаете решение или лучший способ.

С уважением,

Стефан

ответ

7

информация Путь не должен быть в пределах IN() пункта при использовании FOR /R. Корневой путь должен следовать за параметром /R.

@echo off 

:CountLines 
setlocal 
set /a totalNumLines = 0 
for /r %1 %%F in (*.cpp *.h *.hpp *.cs *.c) do (
    for /f %%N in ('find /v /c "" ^<"%%F"') do set /a totalNumLines+=%%N 
) 

echo Total number of code lines for %1 = %totalNumLines% >>log.txt 

Я не помню разницу, но type file|find /c /v "" и find /c /v "" <file может дать разные результаты. Я не помню, что такое условие триггера, или что лучше.

+0

Работает, спасибо! , – Andrew

0

Выполнить это сквозь пальцы:

@echo off 
cd /d "%~1" 
for /f "delims=" %%f in ('dir *.cpp *.h *.hpp *.cs *.c /b /s /a-d ^|find /c /v "" ') do set Count="%%f" 
echo "%count%" 
+0

%% f был неожиданным в это время. – Andrew

Смежные вопросы