2016-07-15 118 views
1

我在腳本中傳遞我的基本文件夾名稱(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循環。

回答

0

不幸的是不能由另一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,你會收到錯誤的結果。

+0

謝謝!唯一的事情就是尺寸小於實際的尺寸。將解決它。 – p2k

+0

'set/A'僅對32位整數算術進行簽名,所以如果某些文件大於2 GiB或總和太大,您將得到意外的結果... – aschipfl

相關問題