导致脚本失败的Powershell控制台

时间:2016-11-15 11:18:26

标签: powershell powershell-v4.0 powershell-ise

得到一个疯狂的,离开了场地。

我们有一个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中运行时类型显示为iTextsharp.text.Document,而在通过控制台运行时显示为iTextSharp.text.Rectangle。

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

干杯 菲尔

2 个答案:

答案 0 :(得分:0)

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

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

$host.Runspace.ApartmentState

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

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

powershell.exe -sta

答案 1 :(得分:0)

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

{{1}}

而不是

{{1}}

结果是$ pdf.Get ...不需要创建新的PDF。

干杯 菲尔