PowerShell中的Word.Application ComObject错误

时间:2012-08-30 14:52:48

标签: powershell comobject powershell-v3.0

我无法使用Powershell将Word 2010(14.0.x)文档提供给SaveAsClose。从网上的所有内容来看,似乎应该使用2.0,但我不再拥有它了。

简单案例:

$Path = "C:\MyDoc.docx"
$Word = New-Object -comobject Word.Application
$Word.Visible = $True #Do this to close it out without task manager
$Doc = $Word.Documents.Open($Path)
$Doc.SaveAs($Path)
$Doc.Close()

此时一切正常,直到保存和关闭:

Argument: '1' should be a System.Management.Automation.PSReference. Use [ref].
At line:5 char:1
+ $Doc.SaveAs($Path)
+ ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodException
    + FullyQualifiedErrorId : NonRefArgumentToRefParameterMsg

Argument types do not match
At line:6 char:1
+ $Doc.Close()
+ ~~~~~~~~~~~~
    + CategoryInfo          : OperationStopped: (:) [], ArgumentException
    + FullyQualifiedErrorId : Argument types do not match

似乎Get-Member显示为有参数的任何方法都失败了。例如,调用一个简单的$ Doc.Save()工作正常。看看这些方法的MSDN信息,它看起来像是SaveChanges方法,但在这一点上,这显然超出了我的技能。

为了获得幸运,我尝试传递$ Null或$ True或$ False,但它只是一直跟着我。

我所能找到的只是显然linked to PS 3.0 Beta(似乎在2.0中对人有效)和评论Ed Wilson hasn't gotten back to

3 个答案:

答案 0 :(得分:2)

我也因此错误而苦苦挣扎,但最后通过调用PSReference的“Value”属性来解决它(我在这里得到了我的信息:https://msdn.microsoft.com/en-us/library/system.management.automation.psreference(v=vs.85).aspx

这最终导致了codeLines:

$filename = [ref]"C:\Temp\pv_report.docx"    
[ref]$option = [Microsoft.Office.Interop.Word.WdSaveFormat] -as [type]
$document.SaveAs(([ref]$filename).Value, ([ref]$option::wdFormatDocumentDefault).Value)
$document.Close()

答案 1 :(得分:1)

您只需在致电[ref]时使用SaveAs即可。这对我有用:

$Path = "C:\MyDoc.docx"
$NewPath = "C:\MyDocRenamed.docx"
$Word = New-Object -comobject Word.Application
$Word.Visible = $True #Do this to close it out without task manager
$Doc = $Word.Documents.Open($Path)
$Doc.SaveAs([ref] $NewPath)
$Doc.Close()

答案 2 :(得分:0)

这可能会对您有所帮助:

http://msdn.microsoft.com/en-us/library/office/cc626294(v=office.12).aspx#VSTO3PowerTools_OfficeInteropAPIExtensions

  

Office Interop API扩展程序

     

Office Interop API Extensions工具使用了中的新功能   Microsoft .NET Framework 3.5和Microsoft Visual C#3.0包装   Office对象模型并为其提供更高效的环境   C#开发人员。具体来说,它采用扩展方法,对象   初始化器和可空类型来创建简化的,   强类型,在某些情况下,类似于Microsoft Visual Basic的API。   它不是Office的完整托管API,但旨在实现   以有用的方式扩充原始对象模型。

     

Office对象模型最初针对动态语言   例如Microsoft Visual Basic for Applications(VBA)和Visual   基本。因此,它广泛使用了他们的一些功能,   例如后期绑定和可选参数。作为一个早期的和   强类型语言,C#可能很笨拙,乏味且容易出错   在这种情况下使用。 Office Interop API扩展,带有它   简化和强类型API,使C#开发人员成为   在此上下文中作为Visual Basic开发人员生产。

我知道PowerShell 3.0是基于CLR4的,但是这个程序集应该仍然可以正常加载。它消除了对所有[ref]参数的需要。由于很多此API都基于扩展方法(在PowerShell中不存在),因此您必须将$word$doc实例作为许多方法的第一个参数传递