不幸的是不能由另一for
變量傳遞一個根目錄路徑到for /R
環,也不是一個delayedly擴展變量,則必須使用一個正常擴張變量(%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
能夠有符號整數arithetics在32位的房間而已,所以如果一個文件是2吉布大或以上,或導致sum
超過2 - 1,你會收到錯誤的結果。
謝謝!唯一的事情就是尺寸小於實際的尺寸。將解決它。 – p2k
'set/A'僅對32位整數算術進行簽名,所以如果某些文件大於2 GiB或總和太大,您將得到意外的結果... – aschipfl