为什么我们不能在 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
替换为 RENAME
或 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.
这种行为不是 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 的一个好建议:
为了增加稳定性(针对 path/filename 中的空格),您可以将调用目标用引号引起来 call 0x22%~d0\:listit:\..\%~pn00x22 @file
.
这是forfiles
才有的特殊语法,其中0xHH
是字符0x22="
.
的十六进制代码
这段代码
forfiles /P %pathname% /M *.log /c "cmd /c echo @file"
会愉快地列出一堆文件。
我们可以将 ECHO
替换为 RENAME
或 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.
这种行为不是 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 的一个好建议:
为了增加稳定性(针对 path/filename 中的空格),您可以将调用目标用引号引起来 call 0x22%~d0\:listit:\..\%~pn00x22 @file
.
这是forfiles
才有的特殊语法,其中0xHH
是字符0x22="
.