Вы можете взломать JREPL.BAT (текстовый процессор регулярных выражений), чтобы подсчитать количество обратных слешей в каждом пути. Сначала я перечисляю корневую папку, чтобы можно было вычесть это значение из максимума, чтобы получить максимальную глубину вложенной папки в корневой папке.
@echo off
pushd %1
(cd & dir /b /s /ad) | jrepl "\\" "$txt=false;n++" ^
/JMATCHQ ^
/JBEG "var n, root, max=0" ^
/JBEGLN "n=0" ^
/JENDLN "if (ln==1) root=n; if (n>max) max=n" ^
/JEND "output.writeLine(max-root)"
popd
Я использовал множество ^
продолжения строки, чтобы код легко читался без горизонтальной прокрутки.
Если вы хотите записать результат в переменную, то самое простое решение - записать выходные данные CD и DIR во временный файл и использовать опцию JREPL / RTN для сохранения результата.
@echo off
setlocal
set "file=%temp%\folders.txt"
pushd %1
(cd & dir /b /s /ad) >"%file%"
popd
call jrepl "\\" "$txt=false;n++" /F "%file%" ^
/JMATCHQ ^
/JBEG "var n, root, max=0" ^
/JBEGLN "n=0" ^
/JENDLN "if (ln==1) root=n; if (n>max) max=n" ^
/JEND "output.writeLine(max-root)" ^
/RTN count
del "%file%"
echo %count%
На моей машине мой код работает примерно в два раза быстрее, чем решение Powerpo от Compo, и на намного, намного * на 1013 * быстрее, чем рекурсивное чистое пакетное решение aschipfl.
Вот гибридное JScript / пакетное решение, для которого не требуется JREPL.BAT
@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
::--- Batch section within JScript comment that calls the internal JScript ----
@echo off
pushd %1 || exit /b
(cd & dir /b /s /ad) | cscript //E:JScript //nologo "%~f0"
popd
exit /b
----- End of JScript comment, beginning of normal JScript ------------------*/
var root=0, max=0, level;
while( !WScript.StdIn.AtEndOfStream ) {
level=WScript.StdIn.ReadLine().split('\\').length-root;
if (!root) root=level;
if (level>max) max=level;
}
WScript.StdOut.WriteLine(max);
Если вы хотите записать результат в переменную, вы можете использовать цикл FOR / F:
@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment
::--- Batch section within JScript comment that calls the internal JScript ----
@echo off
pushd %1 || exit /b
for /f %%A in ('(cd ^& dir /b /s /ad^) ^| cscript //E:JScript //nologo "%~f0"') do set depth=%%A
popd
set depth
exit /b
----- End of JScript comment, beginning of normal JScript ------------------*/
var root=0, max=0, level;
while( !WScript.StdIn.AtEndOfStream ) {
level=WScript.StdIn.ReadLine().split('\\').length-root;
if (!root) root=level;
if (level>max) max=level;
}
WScript.StdOut.WriteLine(max);