Batファイルをスタートアップに登録してみる→やっぱりPARでexe化した→けどUACで死んだ→最後はVB...

batファイルのスタートアップ登録の方法とか知らなかったので、とりあえず試してみた
pl2batコマンドで「iTunesで最近聞いた曲をブログに表示する(Perl使用)」で作ったファイルをbatファイルに

$ pl2bat itunes.pl


batファイル作成(itunes.bat)

@rem = '--*-Perl-*--
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S %0 %*
if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
goto endofperl
@rem ';
#!perl
#line 15

use utf8;
use strict;
use Dumpvalue;
use File::Spec;
use File::HomeDir::Windows;
use LWP::Simple;

my $path = File::HomeDir::Windows->my_music;
my $file = File::Spec->catfile($path, 'iTunes', 'iTunes Music Library.xml');

my @recent_playlist;
my %track_list;
my $last_id = -1;

while (1) {
  # ファイル操作
  open my $data, $file;
  while (my $line = <$data>) {
    # 処理の開始
    if ($line =~ /^<dict>$/) {
      while (my $line = <$data>) {
        # 楽曲の取得
        if ($line =~ /^\t<key>Tracks<\/key>$/) {
          get_music($data);
        }
        # プレイリストの取得
        # デフォルトのとか,Geniusとか,最近再生〜とか,最近追加〜など,左メニューに表示してるやつら
        if ($line =~ /^\t<key>Playlists<\/key>$/) {
          get_playlist($data);
        }
      }
    }
  }
  close $data;
  undef($data);
  
  if ($recent_playlist[0] != $last_id) {
    print $track_list{$recent_playlist[0]}->{Name}, $/;
    my $result = get("表示するファイル出力させる");
    #if (is_error($result)) {
    #  die('oops');
    #}
    $last_id = $recent_playlist[0];
  }
  else {
    #print "-\n";
  }
  undef(@recent_playlist);
  #undef(%track_list);

  sleep(10);
}

# リスト表示
#foreach my $track_id(@recent_playlist) {
#  print $track_list{$track_id}->{Name}, " by ", $track_list{$track_id}->{Artist}, $/;
#}

exit;

sub get_music {
  my $data = shift;
  # <dict>の部分を省略
  my $line = <$data>;
  # 楽曲の取得開始
  while (my $line = <$data>) {
    # 楽曲の取得終了か?
    if ($line =~ /^\t<\/dict>$/) {
      last;
    }
    #my $id = -1;
    ## key
    #if ($line =~ /^\t\t\t<key>([0-9]*?)<\/key>$/) {
    #  $id = $1;
    #}
    # <dict>の部分を省略
    $line = <$data>;
    # dictの中身
    my $track_id;
    while (!((my $line = <$data>) =~ /^\t\t<\/dict>$/)) {
      my($key, $val) = ($line =~ /<key>(.*?)<\/key><[\w]+?>(.*?)<\/[\w]+?>/);
      if ($key eq 'Track ID') {
        $track_id = $val;
        $track_list{$val} = {};
      }
      elsif($key eq 'Artist' || $key eq 'Name') {
        $track_list{$track_id}->{$key} = $val;
      }
    }
  }
}

sub get_playlist {
  my $data = shift;
  # <array>の部分を省略
  my $line = <$data>;
  while (my $line = <$data>) {
    # ライブラリ、Genius、Alternative Plan、トップ25、最近追加した項目、などは無視
    my $str = "\t\t\t<key>Name<\/key><string>最近再生した項目<\/string>";
    utf8::encode($str);
    if ($line =~ /^$str$/) {
      # Playlist Itemsまでの行は無視
      while (my $line = <$data>) {
        if ($line =~ /^\t\t\t<key>Playlist Items<\/key>$/) {
          # <array>は無視
          $line = <$data>;
          # 最近再生したアイテムの取得開始
          while (my $line = <$data>) {
            # リストの取得終了か?
            if ($line =~ /^\t\t\t<\/array>$/) {
              last;
            }
            unless ($line =~ /dict>$/) {
              my($track_id) = ($line =~ /\t\t\t\t\t<key>Track ID<\/key><integer>([\d]*?)<\/integer>$/);
              push(@recent_playlist, $track_id);
            }
          }
          last;
        }
      }
    }
  }
}

1;

__END__
:endofperl


スタートアップファイル用bat作成

start /b c:\service\itunes.bat


■ PAR化
でやったんだけど、なんか上手くいかなかった(起動はするんだけどデータの更新ができてないみたい?)
なのでPARでexe化してみることにした
詳細はこちら(http://supee.blog121.fc2.com/blog-entry-187.html)みてね!
Perl5.8.9でもできるようになっててびびた。


・・・したのはいいんだけど、スタートアップにexeのショートカットつっこんだらUACでひっかかった。
Windows Defender、恐ろしい子・・・!


もう厭になってきたので放棄してbatをiTunes起動した時に一緒に起動するようにした


■ 最後はVB

Dim WShell
Set WShell = WSCript.CreateObject("WScript.Shell")
WShell.Run "C:\\service\\startup_itunes.bat",0

なんか負けた気が凄いする


...なんかiTunes起動してない状態でitunes_updater.batが起動してダメダメになってるだけか
なるほど
でももうめんどくさい...