回答:
サイズを再帰的に合計することができます(以下はバッチファイルです)。
@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 -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ライブラリがどこかにあり、少なくとも任意精度の整数加算が正しく行われます。私は本当にそれをリリースするべきだと思います:-)
du
ディレクトリサイズを指定しますが、それはツリーを歩いて合計することだけです。このようなパイプラインで非常にエレガントに表現できるもの:-)。PowerShellの場合、私は通常、高レベルの目標を適切な低レベルの操作に分解する方法を探します。
folder\*
私のために働いていません私が場所に置いたフォルダのサイズが0バイトを示しています、解決策はありますか?
そのための組み込みのWindowsツールがあります。
dir /s 'FolderName'
これにより多くの不要な情報が出力されますが、最後は次のようなフォルダサイズになります。
Total Files Listed:
12468 File(s) 182,236,556 bytes
隠しフォルダを含める必要がある場合は、を追加し/a
ます。
このリンク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の命の恩人です
\\live.sysinternals.com
それがまだ存在する場合は使用します)。ただし、すべてのsysinternalsツールをデフォルトで含める必要があることに、私は心から同意します。ただし、多くの用途でPowerShellはかなり価値のある代替品です。
一発ギャグ:
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
0.00 C:\Windows
すべてのフォルダに対してこれを最適化できますか、すでに管理者として実行してみました
ft
(Format-Table
)の仕組みです。fl
代わりに試すことができます(Format-List
)
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秒スキャンされました
ここに、現在のディレクトリの下にあるすべてのフォルダーのサイズとファイル数をリストするために書き込む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
。
$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}} }
このコードはテストされています。もう一度確認できます。
@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つの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
私は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
私はあなたの唯一の選択肢はdiruse(高度にサポートされているサードパーティのソリューション)だと思います:
Windows CLIは問題なく非常に制限的です。代わりに、cmdと比較して使用する夢であるCygwinをインストールすることもできます。これにより、移植されたUnixツールduにアクセスできるようになります。これは、Windowsでのdiruseの基礎です。
申し訳ありませんが、ネイティブcliで実行できるコマンドを使用して直接質問に回答することはできませんでした。
:: 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%
単語検索を使用しないため、言語の問題はありません。
制限:
試してください:
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を超えるフォルダーで動作します
画面に書き込むので、必要ない場合は暫定ファイルを使用する必要があります。
次のスクリプトを使用して、特定のフォルダーの下にある各ファイルのサイズを取得して累積できます。
フォルダーパス%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
は、フォルダーの内容を印刷することもできます(上記の例でコメント)
したがって、ここでは、最初に要求した方法で両方の要求を解決する方法を示します。誰もが経験しているファイルサイズの制限なしに、人間が読みやすいファイルサイズが得られます。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
同様の問題を解決しました。このページのいくつかのメソッドは低速で、いくつかは多言語環境で問題があります(すべて英語を想定)。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として使用できます。パラメータは、引用符で囲まれたテスト済みフォルダの名前です。