web-dev-qa-db-ja.com

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

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

Windowsのエクスプローラ→プロパティでフォルダを右クリックしたときと同じ結果になります。

105
Eldad AK

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

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

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

代替手段は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"

1 私はどこかにバッチファイルの中で部分的に完成したbignumライブラリを持っています。それは少なくとも任意精度の整数加算権を得ます。私は本当にそれを解放すべきです、私は推測します:-)

101
Joey

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

dir /s 'FolderName'

これは不必要な情報をたくさん印刷しますが、最後は次のようなフォルダサイズになります。

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

隠しフォルダを含める必要がある場合は/aを追加してください。

97
Andro Secy

私はこのリンクでマイクロソフトによって提供されるSysinternals SuiteからユーティリティDUをダウンロードすることを勧めます http://technet.Microsoft.com/ja-jp/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 Professionalの命を救うものです。

62
Steve

オネリナー:

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
25
frizik

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

11
Custodio

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

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

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

サイズ順に並べられたフォルダのリストを取得する

 1. | DIR:d:/ go |サイズ:325.72 Mb |深さ:1 
 2. | DIR:d:/本|サイズ: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:/本/チェス|サイズ:14.01 Mb |深さ:2 
 6. | DIR:d:/本|サイズ: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が3m12sスキャンされました

6

これは、現在のディレクトリの下にあるすべてのフォルダのリストサイズとファイル数を計算するための強力なコードです。必要に応じて自由に再利用または変更してください。

$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
}
3
Ryan Lee

これは、ディレクトリがかなり静的で、その内容が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
2
Steve

このコードはテスト済みです。もう一度確認できます。

@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
2
Chienvela

次のスクリプトは、特定のフォルダの下にある各ファイルのサイズを取得して累積するために使用できます。
フォルダパス%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
Lior Kirshner

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

試してください:

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
FrinkTheBrave

だからここにあなたが最初に求めた方法であなたの両方の要求に対する解決策があります。それは誰もが経験しているファイルサイズの制限なしで人間の可読性filesizeを与えるでしょう。 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!>>FolderFileCountandSize.txt
    REM remove REM from command 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

1
julesverne

私はあなたの唯一の選択肢はdiruse(非常に支持された第三者の解決策)になると思います:

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

Windows CLIは、不幸にもかなり制限的です。あるいは、 Cygwin をインストールすることもできます。これはcmdと比較して使用するのが夢です。それはあなたがWindows上のディレクトリの基礎である移植されたUnixツールduへのアクセスを与えるでしょう。

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

1
Illizian

私は同様の問題を解決しました。このページのいくつかの方法は遅く、いくつかは多言語環境では問題があります(すべて英語を想定しています)。 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としてそれを使うことができます。パラメータは、引用符で囲まれたテスト済みフォルダの名前です。

0
arpi

:: Dirコマンドが返す行数を取得します(/ -cで数字の区切り記号を削除します)。["Tokens = 3"は、Dirの各行の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%

Word検索を使用しないため、言語上の問題はありません。

制限事項:

  • 2 GB未満のフォルダーでのみ機能します(cmdは32ビットを超える数を処理しません)。
  • 内部フォルダのバイト数を読みません。
0
Gustavo Davico