ぶていのログでぶログ

思い出したが吉日

バッチファイルの小技

はてなブログ開設前にひっそりこっそり運営してたWikiからのコピペ 別名再利用

ファイルサイズを取得する

1. callを使う方法

call :FILESIZE "path:\to\hoge.txt"
exit
    
:FILESIZE
    echo %~z1
    exit /b

2. for文を使う方法

for %%i in (path:\to\hoge.txt) do echo %%~zi

callまたはfor文の引数参照または変数参照の%~zを使えばできる。

ファイルの更新日付を取得する

1. callを使う方法

call :FILESIZE "path:\to\hoge.txt"

exit

:FILESIZE
    echo %~t1
    exit /b

2. for文を使う方法

for %%i in (path:\to\hoge.txt) do echo %%~ti

ファイルサイズを取得する方法を%~tに変えただけ。
取得できる日付フォーマットはYYYY/MM/DD hh:mmで、秒数は何故か取得できない。

"変数名=値"なコンフィグファイルを読み込む

set 変数名=値 なバッチファイルをコンフィグファイルとして読むのは不恰好なので…。

call :LOADCONFIGFILE "path:\to\hoge.config"

exit

:LOADCONFIGFILE
    for /f "delims== tokens=1,*" %%i in ('findstr /r "^[a-zA-Z0-9][a-zA-Z0-9]*=" "%~1"') do echo %%i=%%j
    exit /b

echo %%i=%%jの部分をset %%i=%%jに変えればコンフィグを変数にセットできる。

蛇足

Windows XP SP3とWindows Server 2008 R2では動作確認したが、たぶん、おそらくこれ以上古いWindowsだと動かない (コマンド拡張機能を有効化すればうごくかもしれない)。

蛇足の蛇足

ここまでやるならバッチファイルを使わないほうがいい。 経験的に、謎のバグ(仕様)にハマって泣きを見るから。

バッチファイルは、決められたコマンドを決められた引数と順番で実行する場合のみ使用するべき。

それ以外の場合なら、PowerShellを使うかrubyなりperlなりのLL言語を使ったほうが後々不幸になる確率が格段に減る。