仅使用批处理命令

时间:2016-07-15 12:39:00

标签: batch-file windows-scripting

我在脚本中传递我的基本文件夹名称(C:\Users\IAM\Desktop\MHW\*),并希望获得底层子文件夹的大小。以下代码无效。需要帮助来解决它。

@echo off
setLocal EnableDelayedExpansion
FOR /D %%G in ("C:\Users\IAM\Desktop\MHW\*") DO (
set /a value=0
set /a sum=0
FOR /R "%%G" %%I IN (*) DO (
set /a value=%%~zI/1024
set /a sum=!sum!+!value!
)
@echo %%G: !sum! K
)
pause

根据我的理解,价值" %% G"没有被传递到第二个FOR循环。

1 个答案:

答案 0 :(得分:0)

不幸的是,您无法通过另一个for /R变量将根目录路径传递给for循环,也不能将延迟扩展的变量传递给您,您必须使用正常扩展的变量(%var%)或参数参考(%~1)。

您可以通过将for /R循环放在通过call从主程序调用的子程序中来帮助自己。将保存结果的变量和根目录路径作为参数传递,并分别在子例程中将其展开为%~1%~2

@echo off
setlocal EnableDelayedExpansion
for /D %%G in ("C:\Users\IAM\Desktop\MHW\*") do (
    rem Call the sub-routine here:
    call :SUB sum "%%~G"
    echo %%~G: !sum! KiB
)
pause
endlocal
exit /B

:SUB  rtn_sum  val_path
rem This is the sub-routine expecting two arguments:
rem the variable name holding the sum and the directory path;
set /A value=0, sum=0
rem Here the root directory path is accepted:
for /R "%~2" %%I in (*) do (
    rem Here is some rounding implemented by `+1024/2`:
    rem to round everything down, do not add anything (`+0`);
    rem to round everything up, add `+1024-1=1023` instead;
    set /A value=^(%%~zI+1024/2^)/1024
    set /A sum+=value
)
set "%~1=%sum%"
exit /B

请注意,set /A只能在32位空间中进行有符号整数规范,因此如果文件大于或等于2 GiB,或sum中的结果超过2 31 - 1,您将收到错误的结果。