2012-10-10 490 views

回答

72

您只需加起來大小遞歸(以下是一個批處理文件):

@echo off 
set size=0 
for /r %%x in (folder\*) do set /a size+=%%~zx 
echo %size% Bytes 

然而,這有幾個問題,因爲cmd被限制爲32位有符號整數運算。所以它會得到2 GiB以上的大小錯誤。此外,它可能會多次計算符號鏈接和連接點,所以它最好是一個上限,而不是真正的大小(儘管如此,你會遇到任何工具的問題)。

另一種方法是PowerShell的:

Get-ChildItem -Recurse | Measure-Object -Sum Length 

或更短:

ls -r | measure -s Length 

如果你想讓它更漂亮:

switch((ls -r|measure -s Length).Sum) { 
    {$_ -gt 1GB} { 
    '{0:0.0} GiB' -f ($_/1GB) 
    break 
    } 
    {$_ -gt 1MB} { 
    '{0:0.0} MiB' -f ($_/1MB) 
    break 
    } 
    {$_ -gt 1KB} { 
    '{0:0.0} KiB' -f ($_/1KB) 
    break 
    } 
    default { "$_ bytes" } 
} 

您可以直接從cmd使用:

powershell -noprofile -command "ls -r|measure -s Length" 

我有在批處理文件中的某個地方,至少Right獲取任意精度整數加法部分成品BIGNUM庫。我真的應該放開,我想:-)

+0

+1我只是徘徊在獲取幫助*輸出找到類似的東西。 – Steve

+1

史蒂夫,在我看來,PowerShell比UNIX更適合Unix-y,因爲大多數核心命令都是正交的。在Unix中'du'給出了目錄大小,但它所做的只是遍歷樹和總結。一些東西可以在像這樣的管道中非常優雅地表達:-)。因此,對於PowerShell,我通常會尋找如何將高級目標分解爲合適的低級操作。 – Joey

+0

它似乎沒有返回用戶主目錄的當前結果。在一種情況下,如果我右鍵單擊主文件夾並獲取屬性,我會看到〜200 MB。如果我做了ls -r

|測量長度然後我看到6兆字節(以字節爲單位) – garg

52

我建議從微軟在這個環節所提供的的Sysinternals Suite下載工具DU http://technet.microsoft.com/en-us/sysinternals/bb896651

usage: du [-c] [-l <levels> | -n | -v] [-u] [-q] <directory> 
    -c  Print output as CSV. 
    -l  Specify subdirectory depth of information (default is all levels). 
    -n  Do not recurse. 
    -q  Quiet (no banner). 
    -u  Count each instance of a hardlinked file. 
    -v  Show size (in KB) of intermediate directories. 


C:\SysInternals>du -n d:\temp 

Du v1.4 - report directory disk usage 
Copyright (C) 2005-2011 Mark Russinovich 
Sysinternals - www.sysinternals.com 

Files:  26 
Directories: 14 
Size:   28.873.005 bytes 
Size on disk: 29.024.256 bytes 

當你在這,看看其他公用事業。他們是一個生命的保護程序每個Windows專業

+9

這很難「沒有任何第三方工具」,我想。 – Joey

+7

哦對,但它認爲家庭不應該被視爲'第三方'。 – Steve

+1

好吧,已授予,但它仍然是一個額外的下載(或使用'\\ live.sysinternals.com',如果仍然存在)。儘管我完全同意,所有sysinternals工具都應該默認包含在內。儘管對於許多用途PowerShell是一個非常值得的替代品。 – Joey

1

我認爲你唯一的選擇將是diruse(高度支持的第三方解決方案):

Get file/directory size from command line

Windows的命令行是unfortuntely非常嚴格,你可以或者安裝Cygwin這是一個夢想使用與CMD相比。這將使您可以訪問移植的Unix工具du,這是Windows上diruse的基礎。

對不起,我無法直接用您可以在本地cli上運行的命令來回答您的問題。

+1

如果你只需要'du',那麼Cygwin就是過度殺傷。只要去[GnuWin32](http://gnuwin32.sourceforge.net/)。 – Joey

+2

事實上這是過度的,但它也很棒。 +1你的帖子上面@joey(沒有得到代表做的字面:(:() – Illizian

+0

在我的愚蠢的觀點Cygwin可能是有用的一些,但它遠非真棒,而且可怕。但我猜Unix用戶說相同 – Joey

2

此代碼已經過測試。您可以再次檢查。

@ECHO OFF 
CLS 
SETLOCAL 
::Get a number of lines contain "File(s)" to a mytmp file in TEMP location. 
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /C "File(s)" >%TEMP%\mytmp 
SET /P nline=<%TEMP%\mytmp 
SET nline=[%nline%] 
::------------------------------------- 
DIR /S /-C | FIND "bytes" | FIND /V "free" | FIND /N "File(s)" | FIND "%nline%" >%TEMP%\mytmp1 
SET /P mainline=<%TEMP%\mytmp1 
CALL SET size=%mainline:~29,15% 
ECHO %size% 
ENDLOCAL 
PAUSE 
+0

謝謝,它適用於小於1GB的文件夾,但例如,我有一個文件夾3,976,317,115字節(3.70GB),腳本返回給我這個字符串「)932」,你知道爲什麼嗎? – elady

6

如果您已經安裝在你的電腦的git(越來越常見),只需打開MINGW32和類型:du folder

-2

最簡單的方法得到公正的總規模是PowerShell的,但仍然是事實上的限制長度超過260個字符的路徑名不包含在總數中

+1

這是一個糟糕的答案。什麼是命令行或代碼? – Tatarin

1

我得到了du.exe與我的git分配。另一個地方可能會提到微軟或Unxutils

一旦你在你的路徑中得到du.exe。這是你的fileSizes.bat :-)

@echo ___________ 
@echo DIRECTORIES 
@for /D %%i in (*) do @CALL du.exe -hs "%%i" 
@echo _____ 
@echo FILES 
@for %%i in (*) do @CALL du.exe -hs "%%i" 
@echo _____ 
@echo TOTAL 
@du.exe -sh "%CD%" 

___________ 
DIRECTORIES 
37M  Alps-images 
12M  testfolder 
_____ 
FILES 
765K Dobbiaco.jpg 
1.0K testfile.txt 
_____ 
TOTAL 
58M D:\pictures\sample 
0

我解決了類似的問題。在這個頁面中的一些方法很慢,並且在多語言環境中有一些問題(全部假設爲英文)。 我發現在cmd中使用vbscript的簡單解決方法。它在W2012R2和W7中進行了測試。

>%TEMP%\_SFSTMP$.VBS ECHO/Set objFSO = CreateObject("Scripting.FileSystemObject"):Set objFolder = objFSO.GetFolder(%1):WScript.Echo objFolder.Size 
FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (SET "S_=%%?"&&(DEL %TEMP%\_SFSTMP$.VBS)) 

它設置環境變量S_。當然,您可以更改最後一行以將結果直接顯示到

FOR /F %%? IN ('CSCRIPT //NOLOGO %TEMP%\_SFSTMP$.VBS') DO (ECHO "Size of %1 is %%?"&&(DEL %TEMP%\_SFSTMP$.VBS)) 

您可以將其用作子例程或獨立cmd。參數是用引號括起來的測試文件夾的名稱。

55

有一個內置的Windows工具爲:

dir /s 'FolderName' 

這將打印很多不必要的信息,但年底將文件夾的大小是這樣的:

Total Files Listed: 
     12468 File(s) 182,236,556 bytes 

如果您需要包含隱藏文件夾,請添加/a

+4

如果您不需要整數返回值,這是最優雅的解決方案。注意:'/ a'開關將包含總大小中的隱藏文件和系統文件。 –

+7

這應該是被接受的答案。 –

0

::獲取一個數字,風向命令返回(/ -c消除號分離器。:,)線 [「令牌= 3」只查找在風向每一行的第三列]

FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO set /a i=!i!+1

數倒數第二行,這裏是文件的總和的字節數:

set /a line=%i%-1 

最後獲得倒數第二行的字節數 - 第3列:

set i=0 
FOR /F "tokens=3" %%a IN ('dir /-c "%folderpath%"') DO (
    set /a i=!i!+1 
    set bytes=%%a 
    If !i!==%line% goto :size 
) 
:size 
echo %bytes% 

因爲它不使用單詞搜索它不會有語言問題。

限制:

  • 僅適用於小於2 GB的文件夾(CMD不處理超過32位的數字)
  • 不讀取內部的文件夾的字節數。
1

嘗試:

SET FOLDERSIZE=0 
FOR /F "tokens=3" %A IN ('DIR "C:\Program Files" /a /-c /s ^| FINDSTR /C:" bytes" ^| FINDSTR /V /C:" bytes free"') DO SET FOLDERSIZE=%A 

更改C:\ Program Files文件到任何你想要的文件夾,如果使用批處理文件

更改%A至%%一個它返回的大小整個文件夾,包括子文件夾和隱藏文件以及系統文件,並可處理大於2GB的文件夾。

它會寫入屏幕,因此如果不需要,您將不得不使用臨時文件。

2

我想這隻會工作,如果目錄是相當靜態的,並且其內容不會改變執行兩個dir命令之間的內容。也許有一種方法可以將這個結合成一個命令來避免這種情況,但是這對我的目的起作用(我不想完整列表;只是摘要)。

GetDirSummary.bat腳本:

@echo off 
rem get total number of lines from dir output 
FOR /F "delims=" %%i IN ('dir /S %1 ^| find "asdfasdfasdf" /C /V') DO set lineCount=%%i 
rem dir summary is always last 3 lines; calculate starting line of summary info 
set /a summaryStart="lineCount-3" 
rem now output just the last 3 lines 
dir /S %1 | more +%summaryStart% 

用法:

GetDirSummary.bat C:\ TEMP

輸出:

Total Files Listed: 
      22 File(s)   63,600 bytes 
      8 Dir(s) 104,350,330,880 bytes free 
4

Oneliner:

powershell -command "$fso = new-object -com Scripting.FileSystemObject; gci -Directory | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName | sort Size -Descending | ft @{l='Size [MB]'; e={'{0:N2} ' -f ($_.Size/1MB)}},FullName" 

相同,但只有PowerShell的:

$fso = new-object -com Scripting.FileSystemObject 
gci -Directory ` 
    | select @{l='Size'; e={$fso.GetFolder($_.FullName).Size}},FullName ` 
    | sort Size -Descending ` 
    | ft @{l='Size [MB]'; e={'{0:N2} ' -f ($_.Size/1MB)}},FullName 

這將產生以下結果:

Size [MB] FullName 
--------- -------- 
580,08  C:\my\Tools\mongo 
434,65  C:\my\Tools\Cmder 
421,64  C:\my\Tools\mingw64 
247,10  C:\my\Tools\dotnet-rc4 
218,12  C:\my\Tools\ResharperCLT 
200,44  C:\my\Tools\git 
156,07  C:\my\Tools\dotnet 
140,67  C:\my\Tools\vscode 
97,33  C:\my\Tools\apache-jmeter-3.1 
54,39  C:\my\Tools\mongoadmin 
47,89  C:\my\Tools\Python27 
35,22  C:\my\Tools\robomongo