Powershell 控制台导致脚本失败

Powershell console causing script failures

有一个从左外野出来的疯狂的。

我们有一个由供应商应用程序生成的 PDF 文件需要拆分。我正在使用 iTextSharp.DLL,它运行良好,但仅限于 Powershell ISE。当我尝试 运行 通过控制台运行相同的脚本时,它中断了。

这是脚本的删减部分

Add-Type -Path ("MyDrive:\MyPath\itextsharp.dll");
$pdf = New-Object iTextSharp.text.pdf.PdfReader($sourcePDFFile);
[iTextsharp.text.Document]$sourcePDF = $pdf.GetPageSizeWithRotation($fromPage);
$sourcePDF.Open();

当我在 Powershell ISE 中 运行 这个时,我得到

2016-11-15T19:17:48 Runnning in Windows PowerShell ISE Host as MYDOMAIN\myuser
2016-11-15T19:17:48 Opening PDF file
2016-11-15T19:17:50 Outputting seperated PDF files
2016-11-15T19:17:51 1 file(s) processed out of 3

当我在 Powershell 控制台中 运行 时,我得到

2016-11-15T19:20:19 Runnning in ConsoleHost as MYDOMAIN\myuser
2016-11-15T19:20:19 Opening PDF file
2016-11-15T19:20:21 Outputting seperated PDF files
2016-11-15T19:20:21 —- Exception Message: 
ErrorRecord  : Method invocation failed because [iTextSharp.text.Rectangle] does not contain a method named 'Open'.

如果我在 $sourcePDF 变量上输出 Get-Member 的结果,在 ISE 中 运行ning 时类型显示为 iTextsharp.text.Document,但在 [=32= 时类型显示为 iTextSharp.text.Rectangle ]通过控制台。

希望有人能给我一些关于导致问题的原因以及解决方法的指示。

干杯 菲尔

我怀疑这是问题所在:PowerShell ISE 在不同的单元状态下运行。 ISE 在 STA 中运行。然而,控制台在 MTA 中运行(取决于版本)。

您可以通过以下方式查看公寓状态:

$host.Runspace.ApartmentState

[System.Threading.Thread]::CurrentThread.GetApartmentState()

要强制 PowerShell 控制台以 STA 模式启动,请使用:

powershell.exe -sta

感谢您的所有想法。我已经通过更改变量的创建方式解决了这个问题。

$sourcePDF = New-Object iTextsharp.text.Document;

而不是

[iTextsharp.text.Document]$sourcePDF = $pdf.GetPageSizeWithRotation($fromPage);

事实证明,创建新 PDF 不需要 $pdf.Get...。

干杯 菲尔