読者です 読者をやめる 読者になる 読者になる

高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

フォルダの整理

わたしは、フォルダのカスタマイズを使って、フォルダにそれぞれ独特のアイコンをつけるようにしています。ソフトのフォルダだったら、そのソフトのアプリケーションアイコンを設定しておくなどすると、たとえばオンラインソフト格納フォルダなんてのはかなり見やすくなる。多少パフォーマンスが犠牲になるかもしれませんが、見やすいのに越したことはないですね。

ただ、これでは毎度新しいソフトを入れるたびに大変なので、どうにかできないかと思ったのです。直下のexeファイルのアイコンを自動的に設定する、そんなDesktop.iniを自動生成してくれればいいのに。
というわけで作ってみました。PerlスクリプトなのでActivePerlが必要です。

use Win32::File;
my $dir = shift @ARGV;
my @exes;
my $exename;
# \末端で終わらないようにする
$dir =~ s/\\$//;
chdir $dir;
# ディレクトリ内のEXE列挙
while(<*.exe>)
{
	push(@exes, $_);
}
# ディレクトリ内のICO列挙(JAVAのソフトなど、実行ファイルがない場合のため)
while(<*.ico>)
{
	push(@exes, $_);
}
# exe検索
if(scalar @exes == 1)
{ # アイコンを持ってるものが一つしかない
  $exename = shift @exes;
}elsif(@exes){
  # アイコンを持ってるものが複数。選択させる
  print "what are you select icon file?\n";
  foreach my $i(0..$#exes)
  {
    print "$i = $exes[$i]\n";
  }
  print "input number:";
  $exename = $exes[<STDIN>];
  print "this is unknown" unless $exename;
}else{
  # アイコンを持ってるものがない
  print "icon file not found\n";
}

# Desktop.ini作成
if($exename)
{
  print "you'r select $exename\n";
  open INI, ">Desktop.ini";
  print INI "[.ShellClassInfo]\n";
  print INI "IconFile=$dir\\$exename\n";
  print INI "IconIndex=0\n";
  close INI;
  # 表示できるように属性変更
  Win32::File::SetAttributes("Desktop.ini", Win32::File::HIDDEN);
  Win32::File::SetAttributes(".", Win32::File::READONLY);
}

これをどこかに保存して、SendToフォルダにショートカットでも作っておけば、「送る」から簡単にアイコンが設定できます。プロンプトの英語の意味などかなりめちゃくちゃだと思いますが気にしないでください(^_^;


最後のWin32::File::SetAttributes(".", Win32::File::READONLY);について。ちょっと悩んだんですが、どうもこれがないと、Desktop.iniに何を書いても無視されてしまう。ということで、おそらくこれが鍵になってるのでしょう。
最近Perlをユーティリティ用途に使うことが多くなってきました。とりあえずたいていのものはそろってるので、やろうと思えばやりたいことがすぐできるし、ファイルの列挙などが簡単にできるので使いやすい。テキスト入力支援ソフトなんかにもこの力があるといいですね。