这段代码
forfiles /P %pathname% /M *.log /c "cmd /c echo @file"
会愉快地列出一堆文件。
我们可以将 ECHO
替换为 RENAME
或 MOVE
或许多其他内部命令的组合:异常(exception)是 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
的情况下和标签,这可以用一个简单的技巧来解决。
- 在批处理文件的开头,您需要行
FOR /F ... goto :%%L
. - 并且在调用标签时必须将其括起来
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="
的十六进制代码.
关于windows - 为什么我们不能使用 CALL :label command in the FORFILES script?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60039728/