我想在调用函数中更改计数器变量。
在我的示例中,我想计算所有子文件夹(= count_all),然后我想增加它成功进行的子文件夹的计数(= 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
该代码有效,但我不明白setlocal enabledelayedexpansion
. 当我把它放在调用中:process_subfolders
时,我无法再更改变量,我不知道如何相应地返回它们。不知何故,我可以在调用结束时设置它们endlocal & set "%2=whatever"
(或类似的东西),但我仍然不明白哪些变量是本地的,哪些不是。
和什么时候应该使用 which 和count_all
有什么区别?%count_all%
!count_all!
我建议使用 FOR /D 命令。
一个小测试示例:
至于各种变量替换运算符之间的区别,您不是唯一在这里感到困惑的人。
主要区别在于替换运算符
%
or是否!
与变量的当前值或初始值相关。EnableDelayedExpansion 选项导致变量在 执行时而不是在解析时扩展。当延迟扩展生效时,可以使用 立即读取变量
!variable_name!
。using%variable_name%
将继续显示在行首展开的初始值,这可能与 for 循环不同。我在我的代码中添加了一个
echo
演示差异的命令。它使用!count_all!
,因为 using%count_all%
将导致for
命令启动时的值,始终为0
。但%%i
不需要!
操作符,因为它是作为循环变量编程的。您将在以下帖子中找到详细解释(最受好评的答案):
SETLOCAL 和 ENABLEDELAYEDEXPANSION 如何工作?
两个替换运算符的这种不一致会导致混乱,而这种混乱并不总是仅靠逻辑来解决。有时在正确之前需要反复试验。