ちょっとバッチを書いていてこれは知ってると便利!と思ったのでメモ。
LinuxのBashシェルなどでこのように書く処理
Bashの場合
# hoge.txtの行数を取得してLINECOUNTに代入するコマンド
LINECOUNT=`wc -l hoge.txt`
echo $LINECOUNT
実はWindowsバッチでも同じようなことができる。
Windowsバッチの場合
rem hoge.txtの行数を取得してLINECOUNTに代入するコマンド
for /f "usebackq" %%A in (`type hoge.txt ^| find /c /v ""`) do set LINECOUNT=%%A
echo %LINECOUNT%
め、面倒臭え……。
素直に「変数=`コマンド`」じゃいかんのかと思うけどこう書くらしい。
また「`コマンド`」内でパイプ「|」を使う場合はエスケープが必要で「^|」と書く。
ちょっと応用して、指定したフォルダ下にあるテキストファイルの名前、行数、サイズのリストを取得するバッチの例。
Windowsバッチの場合
rem 入出力設定
set DIR=%~dp0data
set OUTPUT=%dp0count.txt
if exist %OUTPUT% del %OUTPUT%
rem カウント出力処理
setlocal enabledelayedexpansion
for /f "usebackq" %%I in (`dir /b %DIR%`) do (
rem ファイル行数を代入
for /f "usebackq" %%J in (`type %DIR%\%%I ^| find /c /v ""`) do set LINECOUNT=%%J
rem ファイルサイズを代入
for %%K in (%DIR%\%%I) do set SIZE=%%~zK
rem ファイル名、行数、サイズを出力
echo %%I !LINECOUNT! !SIZE!>> %OUTPUT%
)
バッチのfor文内で環境変数を展開する場合は「setlocal enabledelayedexpansion」の指定が必要になる。
また環境変数の展開は「%変数%」ではなく「!変数!」となる。