为什么我们不能在 FORFILES 脚本中使用 CALL :label 命令?

Why can't we use a CALL :label command in the FORFILES script?

这段代码

forfiles /P %pathname% /M *.log /c "cmd /c echo @file"

会愉快地列出一堆文件。

我们可以将 ECHO 替换为 RENAMEMOVE 或许多其他内部命令组合:例外是标签名称的 CALL

例如将上面的ECHO替换为:

forfiles /P %pathname% /M *.log /c "cmd /c CALL :listit @file"
 : :
 : :
exit /b

:listit
echo %1
exit /b

我希望有相同的输出给出错误消息,通常是

Invalid attempt to call batch label outside of batch script.

这种行为不是 Microsoft 的文档所评论的内容,并且由于替代方案完全足够,我没有去寻找让它工作。

但我对 好吧,为什么不呢?!,所以我提出了问题

为什么我们不能在 FORFILES 脚本中使用 CALL :label 命令?

谢谢。

正如@Stephan 已经评论过的,它不能使用标签,因为它是在命令行上下文中执行的。

在大多数情况下,您可以使用更简单的 FOR 命令。

但在需要 forfiles 和标签的情况下,这可以通过一个简单的技巧来解决。

  1. 在批处理文件的开头,您需要行 FOR /F ... goto :%%L
  2. 并且在调用标签时必须将其括起来forfiles ... call %~d0\:<myLabel>:\..\%~pn0
@echo off
FOR /F "tokens=3 delims=:" %%L in ("%~0") DO goto :%%L

...
forfiles /P %pathname% /M *.log /c "cmd /c CALL %~d0\:listit:\..\%~pn0 @file"
...

:listit
echo %1
exit /b

aschipfl 的一个好建议:
为了增加稳定性(针对 path/filename 中的空格),您可以将调用目标用引号引起来 call 0x22%~d0\:listit:\..\%~pn00x22 @file.

这是forfiles才有的特殊语法,其中0xHH是字符0x22=".

的十六进制代码