如何从`for`处理项目(在`in`之后)调用子程序?

时间:2015-10-31 02:07:50

标签: windows batch-file for-loop

init

我正在尝试创建一个在命令运行时更新的进度条。 事情一直运作良好,除了我需要能够在for命令中使用call命令,并且我当前的设置(下面)不起作用。

如何在for循环中使用call命令?

2 个答案:

答案 0 :(得分:2)

不能直接从处理过的项目中调用子程序。

但是可以使用此Aacini's trick来解决此问题:

@echo off
if /I "%1" equ "call" shift & shift & goto %2

setlocal enabledelayedexpansion
for %%a in (*.*) do (
set /a "pre+=1
)

for /f %%a in ('%0 call :star') do (
set /a "count=count+10000"
set /a "fi=10000/pre"
set /a "en=!fi!*!count!"
set "br=!en:~0,-6!"
title !br!
)
pause


exit /b %errorlevel%

:star
echo Some stuff.
echo Some more.
exit /b

你需要在脚本开头加上if /I "%1" equ "call" shift & shift & goto %2行,然后你可以用%0 call :start调用子程序形成for循环。

答案 1 :(得分:1)

阅读整个 FOR Command-Line Referencefor /F

  

如果启用了命令扩展......

     

...

     

最后,您可以使用FOR /F命令来解析a的输出   命令。您可以通过在括号a之间创建文件集来完成此操作   后引用字符串。它将被视为命令行,其中   传递给子CMD.EXE ,并将输出捕获到   内存并解析,好像它是一个文件......

让我指出(详细说明)上述语句:for /F命令捕获并解析指定命令的STDOUT输出。
但是,对于call :star,这是空的(因为Invalid attempt ...消息属于STDERR stream),请参阅下一个示例:

==> call :star
Invalid attempt to call batch label outside of batch script.

==> call :star 2>NUL

==>