windowsでディレクトリを走査するプログラムを書くには?

Windowsでabcディレクトリを走査して、拡張子xyzのファイルをすべてコンバートするスクリプトを書く必要があったのですが、こういう時Windowsならどうすればいいのかってちょっと迷った。UNIX系ならシェルで

  for in `ls abc/*.xyz`
  do
     ...(処理)...
  done

と書くだろうけどWindowsのコマンドでこんなことするにはどうしたらいいのかなぁ。意外と単純なことができない自分に気がつきました。普段の自分の作業環境なら、cygwinもRubyもインストールされているので上記のスクリプトやRubyで

  Dir.glob("abc/*.xyz").each { | f |
     ...(処理)...
  }

とするところなんですが、他人のパソコンにcygwinやRubyを勝手にインストールするわけにも行かずハタと困ってしました。windowsに標準でついているスクリプトって....DOSコマンド?...いつもいつも、Rubyとかbashとかそんなんで処理しているからそれらを取り上げられると達磨さん状態。恥ずかしながら、このたびWSHの存在に初めて気がつきました。Windowsにも標準で付属するスクリプトがあったんですね。 :-)

Dim fs, fd, fc, f
Set fs = CreateObject("Scripting.FileSystemObject")
Set fd = fs.GetFolder("c:\abc\")
For Each f in fd.Files
  if Right(f.name,3) = "xyz" then
     ...(処理)...
  end if
Next

まあ、文法的にはほとんどVBですね。VBはかな~り以前にやったことがあるくらいですが、それほど迷うことなくできました。Windows上でもDOS窓上でも動作するあたりはちょっと便利そうではありますが、やっぱりRubyなんかに比べると明らかに非力な気がしするので、今後の仕様変更を考えて結局、最後はCで書いちゃいました。

WIN32_FIND_DATA fd;
HANDLE hHandle = FindFirstFile(".\\abc\\*.xyz",&fd);

while(hHandle != INVALID_HANDLE_VALUE){
   ...(処理)...
   if (!FindNextFile(hHandle,&fd)) break;

}
FindClose(hHandle);

こうして、コードを並べてみるとRubyのブロック構文ってやっぱり洗練されている気がしますね。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/127

Comments