久しぶりにWindowsのBATファイル書き(awkも併用する)

スクリプトを書く前にコマンドプロンプトで出来ることの再確認です。フォルダ内のファイルから拡張子CSVのファイルだけを抜き出す方法。まずは普通にdirコマンドを入れて見ます。

C:\tmp>dir
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は x28x-xx27 です

 C:\tmp のディレクトリ

2009/12/16  19:03              .
2009/12/16  19:03              ..
2009/12/16  19:03                87 data.txt
2009/12/16  15:47                11 data09121601.csv
2009/12/17  15:47                22 data09121701.csv
2009/12/18  15:47                47 data09121801.csv
2009/12/16  17:55               324 dir.txt
2009/12/16  17:52               324 dir.txt.bk
2009/12/16  19:03                87 file.txt
2009/12/16  15:47                11 file09121601.csv
2009/12/17  15:47                22 file09121701.csv
2009/12/18  15:47                33 file09121801.csv
2009/12/16  15:10               122 ftpscript.txt
2009/12/16  18:18               104 gawkscript.txt
2009/12/16  19:03               238 makelist.bat
2009/12/16  15:09                79 Readme.txt
2009/12/16  19:03               162 today_data.txt
2009/12/16  19:03               162 today_file.txt
              16 個のファイル               1,835 バイト
               2 個のディレクトリ  126,551,736,320 バイトの空き領域

これじゃあ使い物になりません。そこで活用するのがUNIX系では常識のパイプ”|”です。findコマンドと組み合わせると下記の様になります。

C:\tmp>dir | find "csv"
2009/12/16  15:47                11 data09121601.csv
2009/12/17  15:47                22 data09121701.csv
2009/12/18  15:47                47 data09121801.csv
2009/12/16  15:47                11 file09121601.csv
2009/12/17  15:47                22 file09121701.csv
2009/12/18  15:47                33 file09121801.csvCode language: JavaScript (javascript)

これだけでもかなり近づいてきてます。csvファイルだけリストに抽出できていますからね。ちょっと手ごたえを感じてきました。更に同様にしてdataファイルだけ抽出してみます。

C:\tmp>dir | find "csv" | find "data"
2009/12/16  15:47                11 data09121601.csv
2009/12/17  15:47                22 data09121701.csv
2009/12/18  15:47                47 data09121801.csvCode language: JavaScript (javascript)

Windowsのコマンド二種類だけでこれが出来るとは思っていませんでした。ならば日付でも抽出してみましょう。

C:\tmp>dir | find "csv" | find "data" | find "%date%"
2009/12/18  15:47                47 data09121801.csvCode language: JavaScript (javascript)

ここまで出来れば十分かな。dataファイルの今日の日付のファイル名を取り出すことが出来ました。これ以降はコマンドプロンプトに実装されているコマンドだけではつらいと経験上思うので、手っ取り早くUNIX系では常識のawk(オーク)を使うことにします。Windowsには標準ではawkは入っていないので自分でインストールせねばなりません。私はGnu awkをインストールしました。gawkとも呼ばれているみたいです。インストールはPATHを通すだけでOKです。

awkはCSVファイルなどのデータ列を持っているテキストファイルに有効です。CSVファイルには、カンマ区切り、タブ区切り、スペース区切りなどがあります。FS(ファイルセパレータ)と呼ぶらしいです。これを設定してやれば、awkは区切られたデータを読み込むことが出来ます。つまり、上記で生成されたファイルリストを、

  1. 日付
  2. 時刻
  3. ファイルサイズ
  4. ファイル名

に分割することが出来ます。分割したデータはawkが独自ルールの変数に記憶してくれるので、欲しい情報だけ出力させることが出来ます。私が欲しいと思っているのは、2.時刻と4.ファイル名です。やってみます。

C:\tmp>dir | find "csv" | find "data" | find "%date%" | gawk "/.+/ {print $2,$4; }"
15:39 data09121801.csvCode language: JavaScript (javascript)

できました。awkはFS(ファイルセパレータ)で区切られたデータを、自動的に変数$1~$4に入れてくれたのです。FSの指定を省略していますが、gawkのデフォルトではスペースがFSなのだそうです。よってprint指定で$2と$4を指定したので、時刻とファイル名が出力(print)されたという訳です。

とりあえずここまで出来たので後は比較条件を入れたりしながら、BATファイルを組むしかありません。ここからが結構大変ですが、でもコマンドプロンプトレベルで出来ることを確認しておけば、楽できるので手間を惜しまず下調べすることも必要ですね。

最終的には、ファイルの時刻をチェックして変更されていたら自動的にFTPアップロードが走るようにしたいと思っています。もう一息っていうかこれからが課題だな。

コメント

タイトルとURLをコピーしました