1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT

フォルダバット内の全ファイルの個数と合計サイズの一括統計処理

2022-02-10 19:56:52

最近、なぜかパソコンのディスク容量が徐々に減ってきて、しばらくするとまた2~3ギガバイトの容量が解放される。そのフォルダ以下にどんなファイルが生成されて記憶容量を奪っているのか、階層別に監視して最終的に原因を突き止めたい。

インターネットから、コマンドラインで指定したフォルダ・ディレクトリのサイズを表示するバッチ・プログラムを見つけたが、満足できるものではなく、私の使用には必ずしも適しているとは思えない。

最初のプログラムは、フォルダー内のファイルのサイズを表示するものですが、レベル別に表示したいので、私の要求を満たしていません。そのプログラムは次の通りです。

@echo off
echo.
set /p dirPath=please input folder path:
set /a s=1024*1024*1024
for /f "tokens=3 delims= " %%i in ('dir /s /a /-c "%dirPath%" ^|findstr a file') do (set z=%%i)
echo.
echo Folder: %dirPath%
set d=bit
if %z% gtr 1024 set /a "z>>=10"&set d=KB
if %z% gtr 1024 set /a "z>>=10"&set d=MB
if %z% gtr 1024 set /a "z>>=10"&set d=GB

echo The total size of the echo is: %z% %d%&echo.
if %z% LSS %s% echo The contents of the folder is less than 1G
pause>nul

2つ目のプログラムは、現在のフォルダー以下の階層ディレクトリを表示するが、各下位フォルダーのサイズをループ表示しないもので、次のようなプログラムになっています。

@echo off
setlocal enabledelayedexpansion
(for /d %%a in (C:\KuGou\*) do (
  set/a n=z=0
  pushd "%%a"
  for %%b in (*. *.) do (
    set/a n+=1,z+=%%~zb
  )
  set/a "z>>=20"
  popd
  echo;%%a [!n!a!z!M]
))>stats.txt
pause

上の2つのプログラムで、私はそれらを統合し、私が必要とするものに近いはずのプログラムを合成するつもりなので、それを実行し、下の私のプログラムを見てみましょう。

@echo off
setlocal enabledelayedexpansion
echo.
set /p dirPath=please input folder path:
echo %dirPath%
echo.
for /d %%a in (%dirPath%\*) do (
  set /a zz=0
  for /f "tokens=3 delims= " %%t in ('dir /s /a /-c "%%a" ^|findstr a file') do (
  set zz=%%t
  )  
set d=bit
if !zz! GEQ 1024 set /a "z1=!zz!>>10"&set d=KB
GEQ 1024 set /a if !z1! GEQ 1024 set /a "z2=!z1!>>10"&set d=KB
GEQ 1024 set /a "z3=!z2!>>10"&set d=KB
echo Folder: %%a ,size is: !z3!GB = !z2!MB = !z1!!d!
)
for /f "tokens=1-4 delims= " %%i in ('dir /a /-c %dirPath% ^|findstr individual files') do (
  set/a ss=%%k
  set/a ss>>=10,d=bit
  
  if !ss! GEQ 1024 set /a "s1=!ss!>>10"&set d=KB
  GEQ 1024 set /a if !s1! GEQ 1024 set /a "s2=!s1!>>10"&set d=KB
  GEQ 1024 set /a "s3=!s2!>>10"&set d=KB if !s2!
  echo In "%dirPath%" root directory there are %%i %%j ,total size:!s3!GB = !s2!MB = !s1!!d!
  )

pause

コード 4: すべてのファイルとサブフォルダー下のすべてのファイル、およびサブフォルダー下のサブフォルダー下のファイル、およびサブフォルダー下のサブフォルダー下のファイルを含む統計フォルダーを実行することを実装します。

@echo off
setlocal enabledelayedexpansion
(for /f "delims=" %%i in ('dir /s/b/l/ad') do (
cd "%%~fsi"
set/a a=0,n=0
for /f "delims=" %%a in ('dir /b/l/aa') do (
set/a a+=1,n+=%%~za 2>nul
)
set/a n/=1048576
echo.%%~fi : !a! : !n!MB
)) >stats.txt
pause

MBは小数点以下をサポートしておらず、小さすぎるファイルは0として表示され、削除することができます

set/a n/=1048576

を削除し、MBをバイト単位で削除します。

またはKBを修正したものを使用します。

set/a n/=1024
echo.%%~fi : !a! : !n!KB

Code 5: 純粋なバッチ処理では数の計算に限界があるため、バッチ処理とawkの組み合わせでこの問題を解決する。
ドラッグ&ドロップで実行する必要がある

# & cls & (for /f "delims=" %%a in ('dir/a-d/b/s %1') do @echo %%~za) | gawk -v path=%~n1 -f %0 >con & pause & exit
{sum+=$0}
END{
	printf "%s total folder size is: \n%.2f byte\n%.2f MB\n%.2f GB\n",path,sum,sum/1024/1024,sum/1024/1024/1024
}

gawk 4.1.0 のダウンロードはこちらから。 https://www.jb51.net/softs/515570.html

手順はあまり説明されていないので、一目でわかると思いますが、他の人がまとめたものを組み合わせて、メソッドを呼び出すだけです。

1:ダブルクリックで実行し、プロンプトに従ってビルドする必要があるフォルダのパスを入力します。

2:「スタート」-「ファイル名を指定して実行」-「cmd」で、batファイルが格納されている場所を探し、batファイル名を直接入力して実行します。

3つ目 例えば、ファイルに直接出力することもできます。C:\>f3.bat>111.txt 入力後はカーソルが点滅するだけなので、その時点でフォルダパスを直接入力することができます。

  注意:ファイルへの出力フォームを使用する場合、プログラムの実行が終了したときに自動的に終了し、プログラムの中に残らないように、コードの最後にある一時停止行を削除してください。

上記の2つのプログラムは "Batch House" のもので、今後の追跡とレビューのためにアドレスは以下の通りです。