3

这段代码

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

会很高兴地列出一堆文件。

我们可以替换内部命令的ECHOwithRENAME或许多其他组合:标签名称除外。MOVECALL

例如将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.

这种行为不是微软文档中提到的,而且由于替代方案完全足够,我并没有打算让它发挥作用。

但是我对嘛,为什么不感兴趣呢?!,所以我提出了这个问题

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

谢谢你。

4

1 回答 1

5

正如@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 的一个好建议:
要增加一些稳定性(针对路径/文件名中的空格),您可以将调用目标括在引号call 0x22%~d0\:listit:\..\%~pn00x22 @file中。

这只是一种特殊语法forfiles,其中0xHH是字符的十六进制代码0x22="

于 2020-02-03T13:17:26.677 回答