@echo off
setlocal enableExtensions enableDelayedExpansion
cd /D "%~dp0"
set pafIf=%~dp0
call :fIsc "!pafIf:~0,-1!"
goto fIn
:fIsc
setlocal
set "pafIfZs=%1"
set pafIfZs=!pafIfZs:"=!
for /F "tokens=* delims=" %%q in ('dir "!pafIfZs!" /b') do (
echo "!pafIfZs!\%%q\"
if exist "!pafIfZs!\%%q\" (
call :fIsc "!pafIfZs!\%%q"
) else (
call :fIsc1 "!pafIfZs!\%%q"
)
)
goto :eof
:fIsc1
echo 1 %1
goto :eof
:fIn
:scIn
rem endlocal
pause
rem exit /b
В образовательных целях, как for /r
или dir /s /b
может делать рекурсию.
Этот код будет проходить полный путь по мере его повторения.
Добавлено setlocal
для сохранения локальных переменных для каждой рекурсии call
.
Без setlocal
, !pafIfZs!
может быть изменено и один раз рекурсивно
call
возвращает, цикл for
продолжается с измененным !pafIfZs!
это недействительно для текущего call
.
Вывод с setlocal
:
"E:\t t\t.cmd\"
1 "E:\t t\t.cmd"
"E:\t t\t1\"
"E:\t t\t1\t1.txt\"
1 "E:\t t\t1\t1.txt"
"E:\t t\t1\t2\"
"E:\t t\t1\t2\t2.txt\"
1 "E:\t t\t1\t2\t2.txt"
"E:\t t\t3\"
"E:\t t\t3\t3.txt\"
1 "E:\t t\t3\t3.txt"
Press any key to continue . . .
Вывод без setlocal
:
"E:\t t\t.cmd\"
1 "E:\t t\t.cmd"
"E:\t t\t1\"
"E:\t t\t1\t1.txt\"
1 "E:\t t\t1\t1.txt"
"E:\t t\t1\t2\"
"E:\t t\t1\t2\t2.txt\"
1 "E:\t t\t1\t2\t2.txt"
"E:\t t\t1\t2\t3\"
1 "E:\t t\t1\t2\t3"
Press any key to continue . . .
Ток tree
:
E:\T T
| t.cmd
|
+---t1
| | t1.txt
| |
| \---t2
| t2.txt
|
\---t3
t3.txt
Модификатор для f
в %%~fq
может генерировать неверные пути, пока
рекурсивный, так как текущий каталог не меняется и только
имя ( включая расширение ) предоставляется с dir /b
.
Только с именем, ожидайте, что модификатор будет предшествовать
текущий каталог с именем.
Пример модификации, если текущий каталог отличается:
@echo off
setlocal
cd /d "D:\t t"
for /f "delims=" %%q in ('dir /b') do (
cd /d "E:\"
echo %%~fq
if exist "%%~fq" (echo Valid) else echo Invalid
echo(
)
Выход:
D:\t t\t.cmd
Valid
E:\t1
Invalid
E:\t2
Invalid
E:\t3
Invalid
Это показывает, что полный путь %%~fq
построен
из текущего каталога, так как %%q
не является действительным полным
Путь для начала и просто либо имя файла или
имя папки. Вот почему for /r
и dir /b /s
предоставляют
полные пути вместо просто имени файла или имени папки.