windows - 为什么我们不能使用 CALL :label command in the FORFILES script?

标签 windows batch-file cmd method-call forfiles

这段代码

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

会愉快地列出一堆文件。

我们可以将 ECHO 替换为 RENAMEMOVE 或许多其他内部命令的组合:异常(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 的情况下和标签,这可以用一个简单的技巧来解决。

  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=" 的十六进制代码.

关于windows - 为什么我们不能使用 CALL :label command in the FORFILES script?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60039728/

相关文章:

winapi - 使用 CreateProcess 函数启动时,cmd.exe 在某些情况下不会终止

windows - 通过批处理文件查询注册表项值

c++ - 创建的事件数量有限制吗?

windows - CSP如何找到证书的私钥来进行加密操作?

c++ - C++ Windows 字符串转换混淆 WString 和 LPCWSTR

powershell - 为什么从 powershell 调用批处理文件时插入符会消失?

windows - 如何使用 VS 在 Windows 7 上安装 Boost

batch-file - 使用 PuTTY Plink 从批处理文件执行 "su"

batch-file - 批处理脚本中的错误处理

powershell - 如何使用窗口标题启动Powershell?