perl hoge.plだとopen(OUTしている部分で指定の場所にファイルができるのですが、
windowsのタスクに設定し定期実行させた場合起動はされているのですが、0byteのファイルが出力されます。どうもWin32のライブラリがタスクで起動した場合うまく動かないようなのですが
どうすれば動くかお知恵をかして頂けますでしょうか。
OS:windows 7 enterprise 64bit
strawberry perl
script
#!/usr/bin/perl
use strict;
use warnings;
use Encode;
use Win32::OLE;
use Win32::OLE::Const 'Microsoft Excel';
use Win32::OLE::Variant;
my $excel;
eval {
Win32::OLE->GetActiveObject('Excel.Application');
};
if ($@) {
die "Excelが入っていません。 $@";
}
unless (defined $excel) {
$excel = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;}) or die $!;
}
$excel->{Visible} = 'False';
$excel->{DisplayAlerts} = 'True';
my $filename = "/tmp/aaaa.xlsx";
my $book = $excel->Workbooks->Open({'FileName' => $filename,'Password' => '1','ReadOnly' => 'True'});
open(OUT, "/tmp/abc.txt");
my $i = 0;
while (my $sheet = $book->Worksheets(++$i)) {
print OUT $sheet->{Name}."\n";
}
Excel のファイル名の指定で、ドライブが抜けていますが、タスクスケジューラでは、カレントディレクトリの指定をしていますか?
データが置いてあるのが、D ドライブで、タスクは HOME がある C ドライブのディレクトリ、ってことじゃないかと、想像してます。
スクリプトでドライブレターを付けて Excel の Book を指定するか、タスクスケジューラの「プログラムの開始」で「開始(オプション)」で、カレントディレクトリに Excel Book があるディレクトリを指定すると、うまくいくんじゃないか、という気がします。
http://www.atmarkit.co.jp/fwin2k/win2ktips/1368taskw7/taskw7.html
hello worldとだけ出す。hoge1.plをかいてタスクに入れましたがそれは正常に動いております。
■ Process Monitor
http://technet.microsoft.com/ja-jp/sysinternals/bb896645.aspx
何となくですが、以下のケース(非対話型アプリケーションからの Office オートメーションの問題)が該当してそうな気がします。違うかも、ですが。。。
■ Windows7のOfficeサーバーサイドオートメーションで例外がスローされる - プログラマーな日々
http://d.hatena.ne.jp/JHashimoto/20120615/1339731014
■ Office のサーバーサイド オートメーションについて
http://support.microsoft.com/kb/257757/ja