在Powershell函数中返回.NET对象

时间:2014-12-05 01:05:13

标签: .net powershell

我正在努力让以下脚本正常工作。我一直遇到的问题是返回的对象是SystemObject []而不是PdfSharp.Pdf.PdfDocument。

我编写了下面的脚本,想要通过设置$ out = New-Object PdfSharp.Pdf.PdfDocument并捕获返回来在更大的脚本中使用它。不幸的是,这不起作用。

谷歌搜索了几个小时,什么也没发现,我愿意接受建议。

Add-Type -Path C:\assemblies\GDI+\PdfSharp.dll

Function mergePdf {
Param($file1, $file2)

$output = New-Object PdfSharp.Pdf.PdfDocument
$PdfReader = [PdfSharp.PDF.IO.PdfReader]
$PdfDocumentOpenMode = [PdfSharp.Pdf.IO.PdfDocumentOpenMode]


$input = New-Object PdfSharp.Pdf.PdfDocument
$input = $PdfReader::Open($file1, $PdfDocumentOpenMode::Import)
$input.Pages | %{$output.AddPage($_)}
$input = $PdfReader::Open($file2, $PdfDocumentOpenMode::Import)
$input.Pages | %{$output.AddPage($_)}

return $output
}

编辑:为了清晰起见,将$ output.pages更改为之前的$ output,脚本仍然无法正确地从函数中传回PdfSharp.Pdf.Pdfdocument对象。

$obj = mergePdf temp1.pdf temp2.pdf
$obj.Save("./merged/temp.pdf")
Method invocation failed because [System.Object[]] doesn't contain a method named 'Save'
.  At line:1 char:10
+ $obj.Save <<<< ("./merged/temp.pdf")
+ CategoryInfo          : InvalidOperation: (Save:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound

然而

$obj | gm
TypeName: PdfSharp.Pdf.PdfDocument

Name              MemberType Definition                                                 
----              ---------- ----------                                                 
AddPage           Method     PdfSharp.Pdf.PdfPage AddPage(), PdfSharp.Pdf.PdfPage Add...
...
Save              Method     System.Void Save(string path), System.Void Save(System.I...

}

1 个答案:

答案 0 :(得分:1)

认为您正在通过这些行输出多种不同的类型。

$input.Pages | %{$output.AddPage($_)}
...
$input.Pages | %{$output.AddPage($_)}
...
return $output

请记住,函数中的任何命令/管道都不会分配给变量,输出到文件或$ null或转换为[void]将有助于函数的输出。我的猜测是$ output.AddPage($ _)返回一些对象 - 也许是添加的页面。无论如何,将这些行改为:

$input.Pages | %{$output.AddPage($_)} > $null
...
$input.Pages | %{$output.AddPage($_)} > $null
...
$output

另请注意,在这种情况下,不需要return关键字。您只需要使用return关键字尽早摆脱函数。