【问题标题】:Perl fails to open excel file when executing from Windows Task Scheduler从 Windows 任务计划程序执行时,Perl 无法打开 excel 文件
【发布时间】:2013-05-08 18:09:49
【问题描述】:

这是一个非常奇怪的问题。我有一个 Perl(版本 5.12)脚本,可以打开和修改 Excel 电子表格(版本 2007 或更高版本)。下面是打开 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 的任务计划程序中,因为它会在每天的同一时间被调用。当我从任务计划程序运行脚本时,上面的“打开”语句出现错误并中止,但是 $!完全空白。

但是,当我从命令行手动运行 Perl 脚本时,一切正常,包括 open-Excel 逻辑。我无法弄清楚命令行执行和调度程序执行之间的区别,以及为什么打开失败时没有可用的错误消息。

如果您对此问题有任何线索,请告诉我。谢谢。

更新:感谢 Jason Gray,我能够看到错误消息,它抱怨无法访问 Excel 文件。但这对我来说没有意义,因为我可以保证文件路径是正确的,并且没有其他人在使用同一个文件。最重要的是,Perl 脚本在从命令窗口运行时可以完美运行。从任务计划程序运行和从命令行运行可能有什么区别?

解决了!我找到了解决这个奇怪问题的奇怪方法。请参考这些链接: Link1Link2Link3

【问题讨论】:

    标签: perl excel scheduled-tasks windows-server-2008-r2


    【解决方案1】:

    Win32::OLE 文档解释了何时抛出异常/如何捕获它们。

    LastError 在错误发生后为您提供有关错误的信息。

    你可以这样做:

    my $book = $excel->Workbooks->Open($excelPath) || 
               die("Unable to open document ", Win32::OLE->LastError());
    

    【讨论】:

    • 谢谢。我现在可以看到错误消息,但我仍然不知道完整的解决方案。
    • 这可能对您的情况有所帮助。看一下这个。 link
    【解决方案2】:

    请显示您的 $excelPath 变量。您使用的是 absolute 还是 relative 路径?

    您使用什么帐户从调度程序运行脚本?它是否有足够的权限访问您的$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());
    

    【讨论】:

    • 我在 $excelPath 中使用完整路径。我得到的错误消息是:“Microsoft Office Excel”中的 OLE 异常:Microsoft Office Excel 无法访问文件“C:\Book1.xlsx”。有几个可能的原因: • 文件名或路径不存在。 • 该文件正被另一个程序使用。 • 您尝试保存的工作簿与当前打开的工作簿同名。 Win32::OLE(0.1709) 方法/属性获取“打开”中的错误 0x800a03ec
    • 您是在隐藏模式还是可见模式下运行 Excel?这可能意味着您已经运行了阻止此文件的 Excel 进程。运行任务管理器并终止所有正在运行的 Excel 进程。下次再试。
    • 我已经解决了这个问题,虽然我不明白它为什么会起作用。似乎这是 Excel Interop COM 的一个漏洞。请看我上面的更新。
    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2017-08-22
    • 2015-11-18
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多