这段代码
forfiles /P %pathname% /M *.log /c "cmd /c echo @file"
会很高兴地列出一堆文件。
我们可以替换ECHO
with RENAME
or MOVE
或内部命令的许多其他组合:例外是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.
微软的文档没有评论这种行为,而且由于替代方案已经足够了,所以我并没有试图让它发挥作用。
但我感兴趣的是好吧,为什么不呢?,所以我提出这个问题
为什么我们不能在 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
, where 0xHH
是字符的十六进制代码0x22="
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)