Powershell 表达式,该表达式将错误作为作业引发,但以其他方式执行



我是Powershell脚本的新手。我正在尝试运行一个脚本将 Excel 电子表格转换为 PDF 文件。这是我正在使用的脚本:

$excelInputPath = <Path1>;
$pdfOutputPath = <Path2>;
$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -As [type];
$objExcel = New-Object -ComObject excel.application;
$objExcel.visible = $False;
$workbook = $objExcel.workbooks.open($excelInputPath, 3);
$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $pdfOutputPath);
$objExcel.Workbooks.close();
$objExcel.Quit()

就其本身而言,它可以完美地执行。我现在希望添加超时,因此我正在尝试将其作为作业运行。但是,此作业会抛出一个执行错误,我通过接收作业命令捕获该错误:

$excelInputPath = <Path1>;
$pdfOutputPath = <Path2>;
$xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -As [type];
$objExcel = New-Object -ComObject excel.application;
$objExcel.visible = $False;
$workbook = $objExcel.workbooks.open($excelInputPath, 3);
$job = Start-Job -ScriptBlock {$workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $pdfOutputPath);}
$job | Wait-Job -Timeout 10;
If ($job.State -eq 'Running')
{$job.StopJob();
$objExcel.Workbooks.close();
$objExcel.Quit()
throw "Error encountered: Operation timed out"}
else
{if($job.Childjobs[0].Error)
{$objExcel.Workbooks.close();
$objExcel.Quit()
$job | Receive-Job}
else
{$job | Receive-Job;
$objExcel.Workbooks.close();
$objExcel.Quit()}
}

我收到的输出引用如下。该消息是德语的,大致翻译为:"无法对具有 NULL 的表达式执行方法"。

Id     Name            PSJobTypeName   State         HasMoreData     Location             Command
--     ----            -------------   -----         -----------     --------             -------
57     Job57           BackgroundJob   Completed     True            localhost          $workbook.ExportAsFixe...
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
+ CategoryInfo          : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
+ PSComputerName        : localhost

这里另一个令人困惑的事情是,即使作业状态不执行转换并引发此错误消息,也会反映为已完成。

谢谢!除了解释为什么会发生这种情况之外,我将不胜感激任何关于如何更好地执行这项任务的意见。

脚本块不知道变量$workbook$xlFixedFormat::xlTypePDF$pdfOutputPath。 您需要使用-ArgumentList参数将这些作为参数发送。

尝试:

$scriptBlock = {
param($workbook, $format, $outPath) 
$workbook.ExportAsFixedFormat($format, $outPath)
}
$job = Start-Job -ScriptBlock $scriptBlock -ArgumentList $workbook, $xlFixedFormat::xlTypePDF, $pdfOutputPath

相关内容

最新更新