Eu quero mudar uma variável de contador dentro de uma função de chamada.
No meu exemplo eu quero contar todas as subpastas (= count_all) e depois quero incrementar a contagem das subpastas que ela procedeu com sucesso (= count_done).
@echo off
cls
setlocal enableextensions enabledelayedexpansion
set /a "count_all=0"
set /a "count_done=0"
for /d /r %%i in (.\*) do call :process_subfolders "%%i"
if %count_all% EQU 0 (
echo No archives found.
) else (
set /a "counted=1"
for /d /r %%i in (.\*) do call :process_subfolders "%%i"
)
pause
endlocal
goto :eof
::___________________________________________________________________
:process_subfolders
set "folder=%~nx1"
pushd %folder%
if exist *.rar (
if !counted! equ 0 (
set /a "count_all+=1"
) else (
set /a "count_done+=1"
echo !count_done!: %folder%
rem ... do something with the rar files in this folder ...
rem ... for testing: use ping
ping 127.0.0.1 -n 2 > nul
set /a "percent=!count_done!*100/!count_all!"
title !percent!%% [!count_done!/!count_all!]
)
)
popd
exit /b
O código funciona, mas não entendo o comportamento do setlocal enabledelayedexpansion
. Quando coloco na chamada :process_subfolders
não consigo mais alterar as variáveis e não sei como retorná-las de acordo. De alguma forma, eu poderia defini-los no final da chamada endlocal & set "%2=whatever"
(ou algo assim), mas ainda não entendo quais variáveis são locais e quais não são.
Qual é a diferença entre count_all
, %count_all%
e !count_all!
e quando devo usar which?