« 私的2010年五大ITニュース | トップページ | 山形大学が"文章の基礎"を必修に »

2010年2月 3日

ファイル一括処理にWindowsコマンドプロンプトは御法度

結論から先に書くと、ファイルの一括処理、とくに不要ファイルの削除にコマンドプロンプト(DOSプロンプト)を使うのはきわめて危険である。PowerShellを使うべきである。理由は、コマンドプロンプトのコマンド群は8.3形式のファイル名を使って処理をしているからである。バッチファイルを作るときに意図しなかったファイル名が処理対象になることがある。

たとえば、testfile000、testfile001、・・・、testfile199と200個のファイルを作ってみる。そして「del *5*」を実行する。ファイル名に「5」が含まれるもの38個が削除されるかというと、実際には127個も削除されてしまう。「dir *5*」でも同様である。
(注)数は環境によって異なるかもしれない。

なぜこんなことが起きるかというと、ロングファイル名に「5」が入っていないのに、8.3形式ファイル名に「5」が含まれるファイルが大量に存在するからである。8.3形式ファイル名は「dir/x」コマンドで表示できる。以下のように、testfile190~testfile199は8.3形式名に「5」が含まれており、「del *5*」で消えてしまう。

2010/02/03  13:18                 1 TED533~1     testfile190
2010/02/03  13:18                 1 TED543~1     testfile191
2010/02/03  13:18                 1 TED553~1     testfile192
2010/02/03  13:18                 1 TED563~1     testfile193
2010/02/03  13:18                 1 TED573~1     testfile194
2010/02/03  13:18                 1 TED583~1     testfile195
2010/02/03  13:18                 1 TED593~1     testfile196
2010/02/03  13:18                 1 TED5A3~1     testfile197
2010/02/03  13:18                 1 TED5B3~1     testfile198
2010/02/03  13:18                 1 TED5C3~1     testfile199

PowerShellは新しく開発されただけあって、ロングファイル名で処理をしている。上記のようなおかしな、そして危険なことは起きない。コマンドプロンプトに比べると処理速度が遅いのが玉に瑕であるが、結果の正当性のほうが大事である。

さらにRemove-Itemコマンドレット(エイリアスdel)の-whatifオプションを使えば、どのファイルが処理対象かを事前にチェックできる。制御構造もif文、switch文、foreach文などが使えて、コマンドプロンプトのバッチファイルと比べものにならないくらい便利である。

|

« 私的2010年五大ITニュース | トップページ | 山形大学が"文章の基礎"を必修に »

コメント

この記事へのコメントは終了しました。