【发布时间】:2020-02-03 12:57:42
【问题描述】:
这段代码的sn-p
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 命令?
谢谢。
【问题讨论】:
-
cmd /c打开cmd的新实例。所以以下只是一个命令行;没有批处理文件的上下文。您可以改用for:for %%a in ("%pathname%\*.log) do call :listit "%%a" -
这是因为您正在使用的调用指令正在另一个 cmd.exe 实例中运行,而不是作为批处理文件 cmd.exe 实例的一部分。
-
@Stephan,谢谢,是的,这就是我所使用的。
-
@Compo 是的,我想知道是否可能不是这种情况,所以我尝试了
CALL :listit.bat @file作为替代方案,推理可行,但是嗯......不,它没有。 -
没有什么不同,你不能在单独的 cmd.exe 实例中调用带有参数的标签并期望它像那样工作。由于您似乎没有将
forfiles用于特定的事情,比如合并其/D选项,您不妨考虑将findstr /m "^" "%pathname%\*.log"作为替代方案。
标签: batch-file cmd forfiles