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...。
干杯
菲尔
有一个从左外野出来的疯狂的。
我们有一个由供应商应用程序生成的 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...。
干杯 菲尔