这段代码
我本以为它会产生同样的输出,但却出现了错误信息,通常如此。
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.
这种行为并没有在微软的文档中提到,而且由于有完全足够的替代方案,我也没有去寻找使其生效的方法。
但是我对 "嗯,为什么不呢?!"很感兴趣,所以我想问一个问题:
为什么我们不能在 FORFILES 脚本中使用 CALL :label 命令?
谢谢。
cmd /c
opens a new instance ofcmd
. So the following is just a single command line; there is no context of a batch file. You can usefor
instead:for %%a in ("%pathname%\*.log) do call :listit "%%a"
- StephanCALL :listit.bat @file
作为替代方案,认为这样会起作用,但是嗯...它没有。 - ilinkcsCALL :label
语句用于在当前批处理文件中调用标签。请改用CALL listit.bat @file
。参见 https://ss64.com/nt/call.html。 - DodgyCodeException