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

Batch file 从自身的其他实例调用函数/脚本,batch-file,Batch File,例如,此脚本: t、 指令 应与其父文件夹和子文件夹中的每个文件/文件夹进行交互,并列出每个项目的路径,2为文件布线,但运行时使用: 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

例如,此脚本:

t、 指令

应与其父文件夹和子文件夹中的每个文件/文件夹进行交互,并列出每个项目的路径,2为文件布线,但运行时使用:

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"
为什么?

出于教育目的,as For/r或dir/s/b可以执行递归

此代码将在递归时通过完整路径

添加了setlocal以使每个递归调用的变量保持局部。 没有setlocal!帕菲兹!被改变,一旦递归 调用返回时,for循环将继续使用修改的!帕菲兹! 这对当前调用无效

带有setlocal的输出:

不带setlocal的输出:

当前树:

%%~fq中f的修饰符在 递归,因为当前目录没有改变,只有一个 包含扩展名的名称随“目录”一起提供。 仅使用一个名称,期望修饰符在 将当前目录更改为名称

如果当前目录不同,则修改器无效的示例:

@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(
)
输出:

这表明已构建%%~fq的完整路径 来自当前目录的%%q不是有效的完整 开始时的路径是文件名或文件名 文件夹名。这就是为什么for/r和dir/b/s提供
完整路径,而不仅仅是文件名或文件夹名。

您使用一个参数调用:fIsc,但子例程需要两个参数您调用:fIsc,但之后代码将立即输入相同的子例程,因为您没有阻止它。您应该使用Exit或GoTo命令跟随该行。@Stephan您在哪里看到第二个命令?\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu@我不能马上完全理解。。将进入相同的子例程,但退出ot goto是否会中断上一个/上一个循环?要点是对每个子文件夹的for-s进行垃圾处理,这样在完成一个后,上一个文件夹将继续运行?抱歉,它是:Fisc1正确的,因为这是注释区域,而不是答案部分。不幸的是,我无法回答你的问题,因为我完全不知道你想要实现什么。你的问题不够清楚,我无法帮助你,除非你能解释任务和你想要输出什么,而不是仅仅告诉我们它输出什么。我接受它太快了,在一次测试中,脚本没有检测到D:\t\1\2\file.txt,同样是在将%..%更改为!之后!。。!它以另一种方式被破坏,并列出了每个下一个选中的文件夹都是上一个的子文件夹的路径。更新的答案。%…%变量是我错误的调用递归选择,因为它改变了!。。!表现出不同,谢谢你的回复。在调用的标签中缺少setlocal时,的值为!帕菲兹!对于当前调用可能不正确。%%~f[\u]通过一些未知的方式获取数据,它可能会出错,dir/b只提供名称,没有任何其他数据。我想这应该是正确的,代码输出是:`E:\t\t.cmd\1 E:\t\t.cmd E:\t\t1\E:\t\t1\t2\E:\t\t3\按任意键继续…`,在粘贴到这里的过程中,您可能犯了一些错误?您在错误的树上使用了它,请先重新阅读主帖子,代码不在第二级。对不起,更正了树并执行了树,然后发布以确认结构。
@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
"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 . . .
"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 . . .
E:\T T
|   t.cmd
|
+---t1
|   |   t1.txt
|   |
|   \---t2
|           t2.txt
|
\---t3
        t3.txt
@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