これは非常に奇妙な問題です。 Excelスプレッドシート(バージョン2007以降)を開いて変更するPerl(バージョン5.12)スクリプトがあります。下記はExcelファイルを開くためのPerlコードです。
my $excel = Win32::OLE->GetActiveObject("Excel.Application")
|| Win32::OLE->new("Excel.Application", "Quit");
my $book = $excel->Workbooks->Open($excelPath) or die $!;
Perlスクリプト全体がタスクに追加されますWindows Server 2008 R2のスケジューラは、毎日同じ時刻に呼び出されるためです。タスクスケジューラからスクリプトを実行すると、上記の "Open"ステートメントでエラーが発生して中止されますが、$!完全に空白です。
しかし、Perlスクリプトを手動で実行するとコマンドラインでは、すべてオープンExcelのロジックを含めて問題なく動作します。コマンドライン実行とスケジューラ実行の違い、およびOpenが失敗したときにエラーメッセージが表示されない理由を理解できません。
この問題について何か手がかりがあるかどうか私に教えてください。ありがとう。
更新:Jason Greyのおかげで、私はエラーを見ることができたExcelファイルにアクセスできないというメッセージが表示されます。しかし、これは私には意味がありません。ファイルパスが正しいこと、および他のユーザーが同じファイルを使用していることを保証できないからです。タスクスケジューラとコマンドラインから実行する?
解決済み! 私はこの奇妙な問題に対する奇妙な解決策を見つけました。これらのリンクを参照してください。 Link1 Link2 リンク3
回答:
回答№1は1Win32 :: OLEのドキュメントには、いつ例外が投げられるのか/どうやってそれを捕らえるのかが説明されています。
LastError
エラー発生後のエラーに関する情報を提供します。
次のようなことができます:
my $book = $excel->Workbooks->Open($excelPath) ||
die("Unable to open document ", Win32::OLE->LastError());
回答№2の場合は1
見せてください $excelPath
変数。使っていますか 絶対の または 相対 パス?
スケジューラからスクリプトを実行するためにどのアカウントを使用しますか?持っていますか 十分な権利 にアクセスする $excelPath
?
Excelファイルがスクリプト自体と同じフォルダにある場合は、 use FindBin
:
use FindBin qw($Bin);
.....
my $book = $excel->Workbooks->Open("$Bin/Document_name.xls") ||
die("Unable to open document ", Win32::OLE->LastError());