2013/03/17

コマンドプロンプトですべてのファイルに一括処理

コマンドプロンプトで、「あるディレクトリに含まれるファイル全て」に処理を行いたい場合、
for文が使えます。

書式としては、
for 変数 in (場所) do コマンド
となります

具体例として、動画・音楽の形式を変化するffmpegというコマンドを用いて、
あるディレクトリ内にあるflvファイルを全てwavに変換するという作業を考えます。
(ちなみにflvはニコニコ動画などの動画ファイル、wavは音声ファイルです。)

なおffmpegは
ffmpeg -i 入力ファイル 出力ファイル
とすることで、入力ファイルを出力ファイルの形式に変換出来ます。
(ちなみに、ffmpegは入力にワイルドカードを受け付けないので、
 一括処理をしようとするとfor文が必須になります。)

ディレクトリ構造が、
root
|-wavdir
|-flvdir
  |-a.flv
  |-b.flv

となっているとすると、
for %%i in (../flvdir/*.flv) do ffmpeg -i ../flvdir/%%~ni.flv ./%%~ni.wav
と入力し、wavdir内で、バッチファイルとして保存して実行すると、
ffmpeg -i ../flvdir/a.flv ./a.wav
ffmpeg -i ../flvdir/b.flv ./b.wav
というコマンドが順に実行され、
めでたくflvdir内の.flvで終わるファイルが全てwavに変換されwavdirに保存されます。

ここでのポイントは
1. for文で変化させる変数は%%で指定する(例では%%i)。
2. 場所の指定は相対パス。ワイルドカードの*が使用可能。
3.  変数の前に~nをつけるとファイル名の拡張子より前の部分が取得出来る。
  (例では変数名がiなので、その前に~nをつけて、%%~niとなっています)

また、forはバッチファイルとして実行しないとエラーが出るようです。

1 件のコメント:

  1. ありがとう~!助かりました!ffmpegでワイルドカード使えなくて困ってました

    返信削除