Windowsコマンドラインからフォルダーサイズを取得する


128

Windowsで、サードパーティのツールを使用せずにコマンドラインからフォルダーのサイズを取得することはできますか?

Windowsエクスプローラー→プロパティでフォルダーを右クリックしたときと同じ結果が欲しい。

回答:


120

サイズを再帰的に合計することができます(以下はバッチファイルです)。

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

ただし、これはcmd32ビットの符号付き整数演算に制限されているため、いくつかの問題があります。したがって、2 GiBを超えるサイズが間違って取得されます1。さらに、シンボリックリンクとジャンクションを複数回カウントする可能性が高いため、せいぜい上限ではなく、実際のサイズです(ただし、任意のツールでその問題が発生します)。

代替はPowerShellです。

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

以下:

ls -r | measure -sum Length

もっときれいにしたい場合:

switch((ls -r|measure -sum 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 -sum Length"

1バッチファイルに部分的に完成したbignumライブラリがどこかにあり、少なくとも任意精度の整数加算が正しく行われます。私は本当にそれをリリースするべきだと思います:-)


+1 get-help *の出力をさまようだけで、そのようなものを見つけていました。
Steve

2
スティーブ、私の目では、PowerShellは、ほとんどのコアコマンドが本当に直交しているという点で、UnixよりもはるかにUnix-yです。Unixではduディレクトリサイズを指定しますが、それはツリーを歩いて合計することだけです。このようなパイプラインで非常にエレガントに表現できるもの:-)。PowerShellの場合、私は通常、高レベルの目標を適切な低レベルの操作に分解する方法を探します。
Joey、

3
そのように隠しフォルダを無視しているようです。ls -force -rは、隠しフォルダーも含めたい場合に機能します。
garg

2
folder\*私のために働いていません私が場所に置いたフォルダのサイズが0バイトを示しています、解決策はありますか?
IT研究者

2
少し見栄えの良いバージョン:powershell -noprofile -command "'{0:N0}' -f(ls -r | measure -s Length).Sum"
zumalifeguard

120

そのための組み込みのWindowsツールがあります。

dir /s 'FolderName'

これにより多くの不要な情報が出力されますが、最後は次のようなフォルダサイズになります。

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

隠しフォルダを含める必要がある場合は、を追加し/aます。


7
整数の戻り値が必要ない場合、これは最もエレガントなソリューションです。注: '/ a'スイッチは、隠しファイルとシステムファイルを合計サイズに含めます。
オランD.ロード

1
kBやMBなど、もっと便利な単位でファイルサイズを印刷することはできないでしょうね。
David FerenczyRogožan18年

一重引用符の代わりに二重引用符。
user2924019

66

このリンクhttp://technet.microsoft.com/en-us/sysinternals/bb896651から、マイクロソフトが提供するSysinternals SuiteからユーティリティDUをダウンロードすることをお勧めします。

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 Professionalの命の恩人です


11
それはほとんど「サードパーティのツールなしで」ではないと思います。
Joey、

11
ああそうです、しかし家族は「サードパーティ」と考えるべきではないと考えました。
Steve

1
まあ、確かに、それはまだ追加のダウンロードです(または\\live.sysinternals.comそれがまだ存在する場合は使用します)。ただし、すべてのsysinternalsツールをデフォルトで含める必要があることに、私は心から同意します。ただし、多くの用途でPowerShellはかなり価値のある代替品です。
Joey、

1
誰かがPowershellと言いましたか?次を試してください: "{0:N2}" -f((Get-ChildItem C:\ Temp -Recurse | Measure-Object -Property Length -Sum).Sum / 1MB)+ "MB"
John Homer

3
Mark Russinovichが開発したものをすべてダウンロードすることをお勧めします:)私は自分の命を救うツールを見つけたときはいつでもこの名前を見続けます。
dkellner 2017年

46

一発ギャグ:

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

1
すべてのファイルとサイズをベースフォルダーのMbに表示する方法はありますか?この場合、 `C:\ my \ Tools`
Raunak Thomas

2
さらに、フォルダがたくさんあると壊れます(たとえば、C:ドライブ内)
Raunak Thomas

0.00 C:\Windowsすべてのフォルダに対してこれを最適化できますか、すでに管理者として実行してみました
Tilo

これは良いことですが、コンポーネントのフォルダ名が切り捨てられます。それらを完全に表示するコマンドは何ですか?
sean.net

@ sean.netは、長いフォルダの場合に「...」で終わることを意味しますか?これがftFormat-Table)の仕組みです。fl代わりに試すことができます(Format-List
frizik

16

コンピュータにgitがインストールされている場合(一般的になります)、MINGW32を開いて次のように入力します。 du folder


4
du -h -d 1 folder | sort -h人間が読めるサイズ、1レベルのサブディレクトリのみ、サイズでソートする場合は、次のコマンドを使用できます。
vard

8

https://github.com/aleksaan/diskusageユーティリティを使用することをお勧めします。とてもシンプルで親切。そしてとても速い。

コマンドシェルに入力するだけ

diskusage.exe -path 'd:/go; d:/Books'

サイズで整理されたフォルダのリストを取得する

  1. | DIR:d:/ go | サイズ:325.72 Mb | 深さ:1
  2. | DIR:d:/ Books | サイズ:14.01 Mb | 深さ:1

この例は、HDD で272msで実行されました。

たとえば、分析するサブフォルダの深さを増やすことができます。

diskusage.exe -path 'd:/go; d:/Books' -depth 2

選択したフォルダだけでなく、そのサブフォルダのサイズも取得します

  1. | DIR:d:/ go | サイズ:325.72 Mb | 深さ:1
  2. | DIR:d:/ go / pkg | サイズ:212.88 Mb | 深さ:2
  3. | DIR:d:/ go / src | サイズ:62.57 Mb | 深さ:2
  4. | DIR:d:/ go / bin | サイズ:30.44 Mb | 深さ:2
  5. | DIR:d:/ Books / Chess | サイズ:14.01 Mb | 深さ:2
  6. | DIR:d:/ Books | サイズ:14.01 Mb | 深さ:1
  7. | DIR:d:/ go / api | サイズ:6.41 Mb | 深さ:2
  8. | DIR:d:/ go / test | サイズ:5.11 Mb | 深さ:2
  9. | DIR:d:/ go / doc | サイズ:4.00 Mb | 深さ:2
 10. | DIR:d:/ go / misc | サイズ:3.82 Mb | 深さ:2
 11. | DIR:d:/ go / lib | サイズ:358.25 Kb | 深さ:2

*サーバーの3.5Tbが3分12秒スキャンされました


新バージョンがリリースされました! github.com/aleksaan/diskusage改善 :1)シンボリックリンクのサイズを使用した正しい動作2)分析されたオブジェクトに関するorevall情報
Alexander Anufriev

バージョン2.0.2がリリースされました!github.com/aleksaan/diskusage/releases/tag/v2.0.2- インラインパラメーターの代わりに構成ファイル-シンプルな使用モード(diskusage実行可能ファイルを任意のフォルダーにコピーし、実行して結果を取得)-正しい結果出力(正しい行末のシンボルの勝利/ unix)-結果をファイルに保存するか、コンソールモードで取得します(オプション '
tofile

あなたは作者であることに注意してください。(stackoverflow.com/help/promotionから:「ただし、回答への所属を開示する必要があります。」
aeracode

6

ここに、現在のディレクトリの下にあるすべてのフォルダーのサイズとファイル数をリストするために書き込むPowerShellコードがあります。必要に応じて、自由に再利用または変更してください。

$FolderList = Get-ChildItem -Directory
foreach ($folder in $FolderList)
{
    set-location $folder.FullName
    $size = Get-ChildItem -Recurse | Measure-Object -Sum Length
    $info = $folder.FullName + "    FileCount: " + $size.Count.ToString() + "   Size: " + [math]::Round(($size.Sum / 1GB),4).ToString() + " GB"
    write-host $info
}

私のために働く。ヘッドレスサーバーを使用している場合に便利です。
アンドリューパテ

シンプルでエレガント!私のバージョン: $FolderList = Get-ChildItem -Directory -Force; $data = foreach ($folder in $FolderList) { set-location $folder.FullName; $size = Get-ChildItem -Recurse -Force | Measure-Object -Sum Length; $size | select @{n="Path"; e={$folder.Fullname}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} } これはオブジェクトを提供し(より多くのPowershell風)、 'FileCount'および 'Size'は整数で(必要に応じて後で処理できるため)、 'Size'はバイト単位ですが、簡単に変換できますGB(または必要な単位)$Data.Size / 1GB
curropar

またはワンライナー:$Data = dir -Directory -Force | %{ $CurrentPath = $_.FullName; Get-ChildItem $CurrentPath -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Sum Length | select @{n="Path"; e={$CurrentPath}}, @{n="FileCount"; e={$_.count}}, @{n="Size"; e={$_.Sum}} }
curropar

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

おかげで、1 GB未満のフォルダでも機能しますが、たとえば、3,976,317,115バイト(3.70GB)のフォルダがあり、スクリプトがこの文字列 ")932"を返すのはなぜですか。
elady 2014年

2

これは、ディレクトリがかなり静的で、その内容が2つのdirコマンドの実行間で変化しない場合にのみ機能すると思います。これを回避するためにこれを1つのコマンドに結合する方法かもしれませんが、これは私の目的のために機能しました(完全なリストが必要ではなく、要約だけが必要でした)。

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

1

私はdu.exe私のgitディストリビューションを手に入れました。別の場所は前述のMicrosoftまたは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

1

私はあなたの唯一の選択肢はdiruse(高度にサポートされているサードパーティのソリューション)だと思います:

コマンドラインからファイル/ディレクトリのサイズを取得する

Windows CLIは問題なく非常に制限的です。代わりに、cmdと比較して使用する夢であるCygwinをインストールすることもできます。これにより、移植されたUnixツールduにアクセスできるようになります。これは、Windowsでのdiruseの基礎です。

申し訳ありませんが、ネイティブcliで実行できるコマンドを使用して直接質問に回答することはできませんでした。


1
必要なだけの場合du、Cygwinは非常に過剰です。GnuWin32を使用してください
Joey、

2
確かにそれはやり過ぎですが、それも素晴らしいです。@joeyの上の投稿の+1(文字通りそれを行う担当者がいない:()
イリジアン

私の控えめな意見では、Cygwinは一部の人にとっては有用かもしれませんが、素晴らしいとは言えず、恐ろしいものではありません。しかし、UnixユーザーはWineについても同じことを言っていると思います。
Joey、

1
"ワイン"-身震い、私は開発ラップトップでCygwinを使用しています。これは、Linuxでのバッテリ寿命が恐ろしいため、VMを実行するのが不便だからです。設定には多少時間がかかりますが、CygwinはWindowsのnixシェルが見当たらない私たちにとってはすばらしいものです。@Joeyに感謝します。
イリジアン

1

:: Dirコマンドが返す行数を取得します(/ -cで数字の区切り文字を削除します:。、)[Dirsの各行の3列目のみを確認するための "Tokens = 3"]

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

最後から2番目の行の番号。ここで、はファイルの合計のバイト数です。

set /a line=%i%-1

最後に、最後から2行目のバイト数を取得します-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を%% Aに変更します。

サブフォルダー、隠しファイル、システムファイルを含むフォルダー全体のサイズを返し、2GBを超えるフォルダーで動作します

画面に書き込むので、必要ない場合は暫定ファイルを使用する必要があります。


1

次のスクリプトを使用して、特定のフォルダーの下にある各ファイルのサイズを取得して累積できます。
フォルダーパス%folder%は、このスクリプトの引数として指定できます(%1)。
最終的に、結果はパラメータに保持されます%filesize%

@echo off
SET count=1
SET foldersize=0
FOR /f "tokens=*" %%F IN ('dir /s/b %folder%') DO (call :calcAccSize "%%F")
echo %filesize%
GOTO :eof

:calcAccSize
 REM echo %count%:%1
 REM set /a count+=1
 set /a foldersize+=%~z1
 GOTO :eof

注:このメソッドcalcAccSizeは、フォルダーの内容を印刷することもできます(上記の例でコメント)


1

したがって、ここでは、最初に要求した方法で両方の要求を解決する方法を示します。誰もが経験しているファイルサイズの制限なしに、人間が読みやすいファイルサイズが得られます。Win Vista以降と互換性があります。XPは、Robocopyがインストールされている場合にのみ使用できます。このバッチファイルにフォルダーをドロップするか、以下で説明するより良い方法を使用してください。

@echo off
setlocal enabledelayedexpansion
set "vSearch=Files :"

For %%i in (%*) do (
    set "vSearch=Files :"
    For /l %%M in (1,1,2) do ( 
        for /f "usebackq tokens=3,4 delims= " %%A in (`Robocopy "%%i" "%%i" /E /L /NP /NDL /NFL ^| find "!vSearch!"`) do (
            if /i "%%M"=="1" (
                set "filecount=%%A"
                set "vSearch=Bytes :"
            ) else (
                set "foldersize=%%A%%B"
            )
        )
    )
    echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!
    REM remove the word "REM" from line below to output to txt file
    REM echo Folder: %%~nxi FileCount: !filecount! Foldersize: !foldersize!>>Folder_FileCountandSize.txt
)
pause

このバッチファイルを使用できるようにするには、SendToフォルダーに配置します。これにより、フォルダーまたはフォルダーの選択を右クリックし、[送信]オプションをクリックして、このバッチファイルを選択できます。

コンピューター上のSendToフォルダーを見つける最も簡単な方法は、cmdを開いて、この行をそのままコピーすることです。

explorer C:\Users\%username%\AppData\Roaming\Microsoft\Windows\SendTo


Robocopyがファイルを移動するのではないかと心配している人は、..しないでください。/ lオプションはリストのみを表示します。また、Robocopyはサードパーティではありません。Robocopyは、Windows VistaからデフォルトでWindowsにインストールされます。XPをインストールする必要があります。
ジュルスヴェン

追加ありがとうございます。このスレッドがまだ注目されていることを嬉しく思います;-) robocopy(素晴らしいツール!)のインストール方法を追加したいと思うかもしれません。
Eldad Assis

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として使用できます。パラメータは、引用符で囲まれたテスト済みフォルダの名前です。


-3

合計サイズだけを取得する最も簡単な方法はpowershellですが、260文字を超えるパス名は合計に含まれないという事実により制限されます


2
これは悪い答えです。コマンドラインまたはコードとは何ですか?
タタリン2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.