2015-10-31 44 views
3
@echo off 
setlocal enabledelayedexpansion 
for %%a in (*.*) do (
set /a "pre+=1 
) 

for /f %%a in ('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 




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

我試圖創建一個進度條,在命令運行時進行更新。 事情一直運行良好,除了我需要能夠使用for命令內的調用命令,並且我當前的設置(下面)不起作用。如何從`for`處理的項目(`in`後面)調用子程序?

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

+0

你可以把:恆星位另一個批處理文件,只是運行在'for'循環呢? – TessellatingHeckler

+1

這個頁面告訴你如何創建一個函數以及如何調用它。 (http://steve-jansen.github.io/guides/windows-batch-scripting/part-7-functions.html) – Marichyasana

+0

在'pause'和':star'之間,應該有'exit/B'聲明爲了在上面的代碼完成執行後無意地執行':star'; – aschipfl

回答

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

在'pause'和':star'之間,應該有一個'exit/B'語句,以便在上面的代碼完成執行後無意地執行':star'; – aschipfl

+0

@aschipfl - 啊謝謝。 – npocmaka

+0

在('%0 call:star')中將第5行更改爲/ f %% a後,所有內容都完美無缺!謝謝! –

1

整個FOR Command-Line Referencefor /F

如果命令擴展被啓用...

...

最後,你可以使用FOR /F命令來分析的輸出一個 命令。您可以通過在括號之間創建一個 反引號字符串來實現此目的。它會被當作一個命令行,這 是傳遞給孩子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 

==> 
相關問題