ファイルサイズが最大のものを抽出するBat

bat

みんな大好きDosコマンド。
Windows10が利用できるようになって、Bashが使えるようになったとは行っても、まだまだレガシーな環境はある。
場合によっては、Batだけでなんとかしなきゃならない時がある。今日つまったのは、
特定ディレクトリの配下にあるファイル名、サイズソートはDirコマンドを利用して出すことができるけれども、
その中でファイルサイズが最大のものだけを変数に入れて処理をしたい(ただしファイル名にはスペースが存在する)

というニッチな状況
Bash使えたら、ファイルサイズソートは簡単なのに、MS-Batだと少し苦労したので、メモ。

Dirコマンドを利用すると
惜しいかなWindowsさんのイケてる仕様によって、スペースが入っているファイル名を変数にすんなり入らないことがある。

例えば、Windowsといえば、な”Program Files” ディレクトリに注目すると、

set FILEPATH='dir "Program Files"'

としたとき、
echo %FILEPATH% の結果は、  Program になってしまう

これをどうにかしたい。というのが本題。

まずはDirコマンドを利用して、ファイルサイズソートをする

dir Filename /Os /b
  1. オプション O を利用して、 s を利用することでファイルサイズソートになる
  2. オプション b を利用すると詳細を非表示にしてファイル名のみアウトプットする

複数のファイルの中から抽出するときは、 Filename* といった形で正規表現を利用するとよい。

次に肝心の、Batファイルで変数を利用する方法だがこちらは、

for /F "DELIMS=" %%A ('dri FILENAME* /Os /b') DO set MAX_FILE=%%A
  1. Batにする前にコマンドプロンプトでテストする場合、%%Aは%Aとしないと失敗する
  2. for文で特定のコマンド(今回はDirコマンド)の結果を繰り返し変数 MAX_FILE に入れる処理を行う
  3. このとき、 “DELIMS=”をつけないとスペースが含まれたファイル名は利用できず、最初のスペースまでの値が変数に入る

となる。

特にWindowsのBatはBatファイルとして呼び出した場合と、コマンドプロンプト上で対話的に操作した時とで、変数の扱いが異なるところに気をつける必要がある。