从自身的其他实例调用函数/脚本

时间:2019-04-01 09:41:48

标签: batch-file

例如以下脚本:

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"

为什么?

1 个答案:

答案 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 /rdir /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 /rdir /b /s提供的原因 完整路径,而不仅仅是文件名或文件夹名称。