成果物
Windows 7 上で du っぽい表示をするバッチファイルを作成した
使用上の注意
- 文字コードはおそらく
Shift_JIS
固定が安全 (cmd
の場合) - 表示単位は byte のみ
- 限られた環境でしか動作チェックしてません
ソース
du.bat
@echo off
@rem du ぽいもの
if "%1" equ "/?" (
@rem USAGE
echo du [/s] [対象ディレクトリ]
echo /s サブディレクトリ全てを対象にする (s は小文字限定^)
echo 対象ディレクトリ の指定がない場合、カレントを対象にする
exit /b 0
) else if "%1%2" equ "/s" (
SET _SUB_=TRUE
SET _TARGET_=.
) else if "%1" equ "" (
SET _SUB_=FALSE
SET _TARGET_=.
) else if "%1" equ "/s" (
SET _SUB_=TRUE
SET _TARGET_=%2
) else (
SET _SUB_=FALSE
SET _TARGET_=%1
)
if not exist "%_TARGET_%" (
echo "%_TARGET_%" is not exists.
exit /b 1
)
setLocal enableDelayedExpansion
if %_SUB_% equ TRUE (
for /f "useBackq tokens=*" %%y in (`dir /ad-L /b %_TARGET_%`) do (
set _DIR_=%_TARGET_%\%%y
dir /s /a-d "!_DIR_!" > nul 2> nul
if errorLevel 1 (
echo "!_DIR_!" is empty.
) else (
for /f "useBackq tokens=3" %%x in (`dir /s /a-d "!_DIR_!" ^| findstr /e バイト`) do (
set DIR_RECURSIVE_SIZE=%%x
)
echo "!_DIR_!" !DIR_RECURSIVE_SIZE! (bytes^)
)
)
) else (
@rem ↑と共通箇所を分かりやすくするためインデント
set _DIR_=%_TARGET_%
dir /s /a-d "!_DIR_!" > nul 2> nul
if errorLevel 1 (
echo "!_DIR_!" is empty.
) else (
for /f "useBackq tokens=3" %%x in (`dir /s /a-d "!_DIR_!" ^| findstr /e バイト`) do (
set DIR_RECURSIVE_SIZE=%%x
)
echo "!_DIR_!" !DIR_RECURSIVE_SIZE! (bytes^)
)
)
exit /b 0
のように呼び出す形に書くと
call :__function
で呼んだサブルーチンの先では、引数を DelayedExpansion できてなかった。
%%y
を遅延展開させる書き方があるのだろうか・・・?
細かい箇所が微妙
- 命名とか大文字/小文字とかの規約が謎
-
dir /s /a-d "!_DIR_!"
の内容をtail -1
するために、1行ずつ変数に入れては上書きを繰り返す、という不毛な記述が必要 - ディレクトリが空なら
0 bytes
表示で別に良かったのだけれど、空ディレクトリの場合に出る警告「ファイルが見つかりません」を捨てる手段がよく分からず・・・ - 存在しないオプションが渡されることを考慮していない