cancanIMGL1378_TP_V

dirコマンドに頭を悩ましました
適当にアレンジして使ってください

背景

こんな感じに構成されたフォルダを管理しています。
01
test1、test2・・・と続くのはユーザ単位のフォルダ。
その配下には[フォルダA]や[フォルダB]があって、構成は各ユーザ同じだが、フォルダ内のサブフォルダ、ファイルはそれぞれ違う。
部門フォルダやユーザープロファイルなんかを管理しているような情報システム管理部門の方なら「あぁ・・・」となんとなく察していただけるのではないかと。

これの各[フォルダA]のファイルサイズ合計だけ集計できないかなー、と捏ね繰り回してみました。



コマンド例

捏ね繰り回した結果がコレ。
@echo off
@setlocal enabledelayedexpansion

for /f "usebackq tokens=4 delims= " %%a in (`dir "[親フォルダ]"`) do (

  set folder="[親フォルダ]\%%a\[フォルダA]"
  
  dir /s /a-d /-C !folder! > nul
  
  if not !ERRORLEVEL! == 0 (
    set filesize=0  
  
  ) else (
  
    for /f "usebackq tokens=3 delims= " %%i in (`dir /s /a-d /-C !folder! ^|find "個のファイル"`) do (
      set filesize=%%i
    )
  )

  echo "!folder!","!filesize!","バイト"

)
適当な解説

2行目
@setlocal enabledelayedexpansion
遅延環境変数を使うための宣言。

4行目
for /f "usebackq tokens=4 delims= " %%a in (`dir "[親フォルダ]"`) do (
dirコマンドの結果から[親フォルダ]配下のtest1、test2・・・を取得する(tokens=4)。
それらについてループ開始。

8行目
dir /s /a-d /-C !folder! > nul
一回dirコマンドを実施してエラーが無いか確認。
nulにリダイレクトすることでこのdirコマンド結果は出力しないようにする。

10行目
if not !ERRORLEVEL! == 0 (
8行目のコマンド結果を環境変数「ERRORLEVEL」から確認。
エラーだったらファイルサイズ0として出力する。

15行目
for /f "usebackq tokens=3 delims= " %%i in (`dir /s /a-d /-C !folder! ^|find "個のファイル"`) do (
  set filesize=%%i
)
[フォルダA]に対してdirコマンドでファイルサイズを集計。
サブフォルダがある場合、それ毎に結果出力され、最後に総合結果が出力されるので、
最終行のみ取得するため、ループして同じ変数に代入し続ける。

20行目
echo "!folder!","!filesize!","バイト"
結果出力。


実際の使い方
コマンドをbatファイルにして、出力結果をファイルにリダイレクトするといいと思います。
csvファイルに出力して、いろいろ加工するとやりやすいですね。
check.bat >check.csv

実施結果はこんな感じ
10
2列目をSUMしてやれば合計が計算できます。
1-3行目にゴミが出ちゃいますが、これ以上コマンドを弄るより出力ファイルを編集した方が早い!ってことでこのままです!

適当にアレンジして使ってください。