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