例如以下脚本:
t.cmd
@echo off
setlocal enableExtensions enableDelayedExpansion
cd /D "%~dp0"
set pafIf=%~dp0
call :fIsc "!pafIf:~0,-1!"
goto fIn
:fIsc
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
应与其父文件夹和每个子文件夹中的每个文件/文件夹进行交互,并列出每个项目的路径,对于文件来说两次,但要使用以下命令运行它:
E:\t t\
__ t.cmd
__ t1\
__ __ t1.txt
__ __ t2\
__ __ __ t2.txt
__ t3\
__ __ t3.txt
树,给出以下输出:
"E:\t t\t.cmd\"
1 "E:\t t\t.cmd"
"E:\t t\t1\"
"E:\t t\t1\t2\"
"E:\t t\t1\t2\t3\"
1 "E:\t t\t1\t2\t3"
为什么?
答案 0 :(得分:1)
@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
提供的原因
完整路径,而不仅仅是文件名或文件夹名称。